Merlin 的魔力:Swing 中的声音

转载 2004年07月10日 17:25:00

发信人: ttlink (SkyWalker), 信区: Java
标  题: Merlin 的魔力:Swing 中的声音
发信站: 日月光华 (2002年12月20日10:55:22 星期五), 站内信件

http://www.cn-java.com/target/news.php?news_id=2137


http://www-900.ibm.com/developerWorks/cn/java/j-mer0730/index.shtml


Swing 体系结构一直为开发者提供创建类似于本地 UI 的 Java 应用程序用户界面的方
法。Java 2 平台标准版(Java 2 Platform,Standard Edition)的最新版本进一步拓
展了这个观念,它提供了一种将反馈声音与 UI 操作关联起来的机制 — 这里所说的反
馈声音也就是用户习惯于从计算机扬声器中听到的哔哔声和叮当声。尽管该功能在缺省
情况下是关闭的,John Zukowski 在 Magic 的魔力的这篇最新的文章中向您展示了如何
发挥它的力量。
J2SE 版本 1.4 中新增了一项有趣的 Swing 功能。Swing 控件现在可以提供听觉反馈来
对特定事件作出响应,不过缺省情况下这项功能是禁用的。新增的这项功能有助于
Swing 控件更好地模仿系统本地操作系统的控件的行为。

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


  UIManager.put("Button.foreground", Color.red);

 

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

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

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

CheckBoxMenuItem.commandSound
InternalFrame.closeSound
InternalFrame.maximizeSound
InternalFrame.minimizeSound
InternalFrame.restoreDownSound
InternalFrame.restoreUpSound
MenuItem.commandSound
OptionPane.errorSound
OptionPane.informationSound
OptionPane.questionSound
OptionPane.warningSound
PopupMenu.popupSound
RadioButtonMenuItem.commandSound
提供给 AuditoryCues.playList 属性的 String 名称数组就是这样 — 一个事件名称的
集合。UI 管理器负责将这些名称映射到特定于外观和感觉的声音。

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

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


  UIManager.put("AuditoryCues.playList",
    UIManager.get("AuditoryCues.allAuditoryCues"));

 

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

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

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


  UIManager.put("OptionPane.questionSound", "sounds/OptionPaneError.wav");

 

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

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

图 1. 示例应用程序界面


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

清单 1. 声音示例
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Audio extends JFrame {

  public Audio() {
    super("Auditory Popups");
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    UIManager.put("AuditoryCues.playList",
      UIManager.get("AuditoryCues.defaultCueList"));
    UIManager.put("OptionPane.questionSound",
      "sounds/OptionPaneError.wav");

    JPanel contentPane = (JPanel)this.getContentPane();
    JPanel center = new JPanel();
    ButtonGroup buttonGroup = new ButtonGroup();

    JRadioButton defaultAudio = new JRadioButton("Default", true);
    center.add(defaultAudio);
    buttonGroup.add(defaultAudio);
    defaultAudio.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        UIManager.put("AuditoryCues.playList",
          UIManager.get("AuditoryCues.defaultCueList"));
      }
    });

    JRadioButton offAudio = new JRadioButton("Off", false);
    center.add(offAudio);
    buttonGroup.add(offAudio);
    offAudio.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        UIManager.put("AuditoryCues.playList",
          UIManager.get("AuditoryCues.noAuditoryCues"));
      }
    });

    JRadioButton onAudio = new JRadioButton("On", false);
    center.add(onAudio);
    buttonGroup.add(onAudio);
    onAudio.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        UIManager.put("AuditoryCues.playList",
          UIManager.get("AuditoryCues.allAuditoryCues"));
      }
    });

    contentPane.add(center,  BorderLayout.CENTER);

    JButton confirmButton = new JButton("Confirmation Dialog");
    contentPane.add(confirmButton, BorderLayout.SOUTH);
    confirmButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        int result = JOptionPane.showConfirmDialog(Audio.this,
          "Confirm?");
        if (result == JOptionPane.YES_OPTION) {
          JOptionPane.showMessageDialog(Audio.this, "Confirmed");
        } else {
          JOptionPane.showMessageDialog(Audio.this, "Rejected");
        }
      }
    });

    JButton messageButton = new JButton("Message Dialog");
    contentPane.add(messageButton, BorderLayout.NORTH);
    messageButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(Audio.this, "The Message");
    });
    this.pack();
    show();
  }
  public static void main(String args[]) {
    new Audio();
  }
}

 

--
---
   Everyday is a winding road
---
ftp://10.11.202.202
※ 来源:·日月光华 bbs.fudan.edu.cn·[FROM:the city of Vampire]                                                        

Merlin 的魔力: 字符集

引用:http://www-128.ibm.com/developerworks/cn/java/j-mer1022/index.html转换与编码模式John Zukowski总裁, JZ Vent...
  • chnjxiang
  • chnjxiang
  • 2005年09月27日 10:07
  • 694

Merlin 的魔力: 另一个简单的 Frame

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";...
  • java169
  • java169
  • 2008年05月21日 03:01
  • 89

Merlin TTS 深度学习的语音合成

github https://github.com/CSTR-Edinburgh/merlin 安装与训练 参考这个文档即可 在Mac上安装成功 http://jrmeyer.github.io/m...
  • u010157717
  • u010157717
  • 2017年03月04日 02:36
  • 3146

Swing 中的声音

 import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Audio extends JFrame { ...
  • a_nuo
  • a_nuo
  • 2008年08月06日 17:33
  • 375

Merlin 的魔力: 另一个简单的 Frame

Java 1.4 现在允许除去 Frame 的 Title bar 并允许通过编程控制将 Frame 最大化。通过这个快速入门,John Zukowski 详细描述并演示了这些变化,同时还说明了如何支...
  • tangxufeng
  • tangxufeng
  • 2009年02月08日 11:35
  • 378

深入解读《Gartner2017年商业智能和分析平台魔力象限报告》

2017年2月16日,Gartner发布了2017年BI商业智能和分析平台魔力象限报告,本文主要对此进行一些解读,帮助大家更好了解市场状况和趋势。...
  • yuanziok
  • yuanziok
  • 2017年02月24日 10:47
  • 2779

Merlin 的魔力: 维护插入顺序

级别: 初级                        John Zukowski                        2001 年 8 月 01 日        J2SE 1.4...
  • NK_HansWang
  • NK_HansWang
  • 2008年02月19日 19:25
  • 442

网易之使用k次魔力之后魔力手环的状态

import java.util.Scanner; /** * * 小易拥有一个拥有魔力的手环上面有n个数字(构成一个环),当这个魔力手环每次使用魔力的时候就会发生一种奇特的变化:每个数字会变...
  • pomay
  • pomay
  • 2017年05月16日 13:34
  • 312

网易2017实习生编程题 魔力手环

题目来源: https://www.nowcoder.com/question/next?pid=4575457&qid=83056&tid=7518247 描述: 小易拥有一个拥有魔力的手环上...
  • hermito
  • hermito
  • 2017年03月27日 10:01
  • 2895

Merlin doc 0.0.1

Merlin doc 0.0.1
  • lujian1989
  • lujian1989
  • 2017年02月20日 10:39
  • 900
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Merlin 的魔力:Swing 中的声音
举报原因:
原因补充:

(最多只允许输入30个字)