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(center BorderLayoutCENTER);
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();
}
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25995.html