电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

Swing 中的声音


发布日期:2023/6/3
 

JSE 版本 中新增了一项有趣的 Swing 功能Swing 控件现在可以提供听觉反馈来对特定事件作出响应不过缺省情况下这项功能是禁用的JSE 版本 中新增了一项有趣的 Swing 功能Swing 控件现在可以提供听觉反馈来对特定事件作出响应不过缺省情况下这项功能是禁用的新增的这项功能有助于 Swing 控件更好地模仿系统本地操作系统的控件的行为

听觉基本知识

Swing 使用一种可插式外观和感觉(Pluggable LookandFeelPLAF)体系结构开发者不必针对不同组件为颜色和字体之类的设置进行硬编码取而代之的是组件将从用户界面管理器(User Interface(UI)Manager)请求这些设置作为开发者您可以告诉 UI 管理器要让用户看到什么样的界面您可以选择 WindowsMotif 或 Metal 样式等UI 管理器接下来就可以实际告诉每个组件应该如何显示它自身对于象按钮这样的组件来说前景颜色是通过设置 Buttonforeground 属性来控制的如下所示

anagerput(Buttonforeground Colorred);

在这里 Buttonforeground 为用户界面属性名而 Colorred 代表特定的设置改变了设置之后所有新的按钮的前景颜色都将是红色(也有方法可以改变以前创建的按钮的前景颜色)虽然不同的预置外观和感觉为这些设置提供了缺省值您还是可以重设它们

在 JSE 您可以用类似的方式来启用听觉反馈您只要了解 UI 属性名和合适的设置就可以了属性在这里被命名为 AuditoryCuesplayList 设置则为听觉提示名称的一个 String 数组UI 管理器接下来将把这些名称映射到特定操作发生时将播放的声音文件

下面将给出系统提供的外观和感觉中所支持的声音列表它们的名称本身就颇具解释性

mandSound

InternalFramecloseSound

InternalFramemaximizeSound

InternalFrameminimizeSound

InternalFramerestoreDownSound

InternalFramerestoreUpSound

mandSound

OptionPaneerrorSound

rmationSound

OptionPanequestionSound

OptionPanewarningSound

PopupMenupopupSound

RadmandSound

提供给 AuditoryCuesplayList 属性的 String 名称数组就是这样 ― 一个事件 名称的集合UI 管理器负责将这些名称映射到特定于外观和感觉的声音

您可以从这些名称中手动地创建一个真正希望支持的事件名称的数组不过这并不是必需的值得庆幸的是对于常用的组来说已经有两个系统定义过的设置可以使用还有一个设置可以用于 Metal 外观和感觉

这些设置提供了一个查找键 AuditoryCuesallAuditoryCues 它允许您从 UI 管理器查找适用于所有声音的数组一旦您查找了这个数组就可以用 AuditoryCuesplayList 键将其存储在 UI 管理器中如下所示

UIManagerput(AuditoryCuesplayList

UIManagerget(AuditoryCuesallAuditoryCues));

您还可以使用另外两个查找键 AuditoryCuesnoAuditoryCues 即无声还有 AuditoryCuesdefaultCueList 它只为四种 OptionPane 设置播放声音提示专门用于 Metal 外观和感觉

一旦您改变了 AuditoryCuesplayList 设置就可以使用一组新的声音提示了当特定操作发生时UI 管理器将检查播放列表寻找与该操作关联的键UI 管理器接下来将使用这个键来查找要载入并播放的声音文件如果提示(cue)数组中不存在任何键就不会播放任何声音

如果您不喜欢某个声音可以通过将其提示名映射到另一个文件来替换它举例来说在下面的代码中您将看到问题(question)声音被映射到系统提供的错误(error)声音文件

UIManagerput(OptionPanequestionSound sounds/OptionPaneErrorwav);

这就是在 Swing 程序中播放与预先定义好的操作关联的听觉提示所涉及的所有内容

完整示例

为了展示我们刚才描述过的功能清单 中的程序将显示三个单选按钮让您选择希望使用三种提示设置中的哪一种您可以参看图 中简单的用户界面

示例应用程序界面

程序还显示了两个显示弹出窗口的按钮启用后显示弹出窗口的操作将触发声音提示请您自己将确认对话框出现时播放 错误声音文件的代码行标记出来

清单 声音示例

import javaawt*;

import javaawtevent*;

import javaxswing*;

public class Audio extends JFrame {

public Audio() {

super(Auditory Popups);

setDefaultCloseOperation(EXIT_ON_CLOSE);

UIManagerput(AuditoryCuesplayList

UIManagerget(AuditoryCuesdefaultCueList));

UIManagerput(OptionPanequestionSound

sounds/OptionPaneErrorwav);

JPanel contentPane = (JPanel)thisgetContentPane();

JPanel center = new JPanel();

ButtonGroup buttonGroup = new ButtonGroup();

JRadioButton defaultAudio = new JRadioButton(Default true);

centeradd(defaultAudio);

buttonGroupadd(defaultAudio);

defaultAudioaddActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

UIManagerput(AuditoryCuesplayList

UIManagerget(AuditoryCuesdefaultCueList));

}

});

JRadioButton offAudio = new JRadioButton(Off false);

centeradd(offAudio);

buttonGroupadd(offAudio);

offAudioaddActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

UIManagerput(AuditoryCuesplayList

UIManagerget(AuditoryCuesnoAuditoryCues));

}

});

JRadioButton onAudio = new JRadioButton(On false);

centeradd(onAudio);

buttonGroupadd(onAudio);

onAudioaddActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

UIManagerput(AuditoryCuesplayList

UIManagerget(AuditoryCuesallAuditoryCues));

}

});

contentPaneadd(centerBorderLayoutCENTER);

JButton confirmButton = new JButton(Confirmation Dialog);

contentPaneadd(confirmButton BorderLayoutSOUTH);

confirmButtonaddActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

int result = JOptionPaneshowConfirmDialog(Audiothis

Confirm?);

if (result == JOptionPaneYES_OPTION) {

JOptionPaneshowMessageDialog(Audiothis Confirmed);

} else {

JOptionPaneshowMessageDialog(Audiothis Rejected);

}

}

});

JButton messageButton = new JButton(Message Dialog);

contentPaneadd(messageButton BorderLayoutNORTH);

messageButtonaddActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

JOptionPaneshowMessageDialog(Audiothis The Message);

}

});

thispack();

show();

}

public static void main(String args[]) {

new Audio();

}

}

上一篇:Hessian 原理分析

下一篇:类的设计方法