淺析Swing Set示例
Swing 工具包提供各種用于創(chuàng)建用戶(hù)界面的工具和幾乎令人眼花繚亂的選項(xiàng),這些選項(xiàng)用于在程序生存期間修改界面。小心地使用這些功能可以導(dǎo)致界面能夠適應(yīng)用戶(hù)的需要并簡(jiǎn)化交互過(guò)程。粗心地使用同樣的功能可以導(dǎo)致非?;靵y或徹底不可用的程序。您將修改隨 Sun JDK 一起提供的基于 Swing Set示例應(yīng)用程序的源代碼;此應(yīng)用程序的 UI 使用許多動(dòng)態(tài)的特性并且可以作為理解它們的極好的起點(diǎn)。
禁用小部件
動(dòng)態(tài) UI 的最簡(jiǎn)單形式是使不可用的菜單項(xiàng)或按鈕變灰的 UI。禁用 UI 小部件與禁用所有小部件的方法都是相同的。setEnabled() 函數(shù)是 Component 類(lèi)的一個(gè)功能。清單 1 顯示了禁用按鈕的代碼:
清單 1. 禁用按鈕
- button.setEnabled(false);
正如您看到的,十分簡(jiǎn)單。關(guān)鍵問(wèn)題是何時(shí)應(yīng)該 啟用或禁用一個(gè)按鈕。通常的設(shè)計(jì)決策是當(dāng)按鈕不可用時(shí)禁用它。例如,當(dāng)一個(gè)文件從上一次保存以來(lái)還沒(méi)有被修改時(shí),很多程序禁用 Save 按鈕(以及任何相應(yīng)的菜單項(xiàng))。
關(guān)于禁用按鈕的重要警告是要記住在適當(dāng)?shù)臅r(shí)候重新啟用它們。例如,如果在單擊按鈕和按鈕的動(dòng)作完成之間有一個(gè)確認(rèn)步驟,即使確認(rèn)失敗也應(yīng)該重新啟用按鈕。
調(diào)整范圍
有時(shí),應(yīng)用程序需要?jiǎng)討B(tài)地調(diào)整數(shù)值小部件的范圍,例如 Spinner 或者 Slider。這可能比它看起來(lái)要復(fù)雜許多。特別是 Slider 有二級(jí)功能 —— 刻度、刻度間隔和標(biāo)簽 —— 這些可能需要隨著范圍的調(diào)整而加以調(diào)整以避免災(zāi)難發(fā)生。
Swing Set示例沒(méi)有進(jìn)行任何一項(xiàng)調(diào)整,所以您需要通過(guò)把 ChangeListener 連接到一個(gè)可以修改其他滑塊的滑塊來(lái)修改它。輸入新的 SliderChangeListener 類(lèi), 如清單 2 所示:
清單 2. 更改滑塊的范圍
- class SliderChangeListener implements ChangeListener {
- JSlider h;
- SliderChangeListener(JSlider h) {
- this.h = h;
- }
- public void stateChanged(ChangeEvent e) {
- JSlider js = (JSlider) e.getSource();
- int i = js.getValue();
- h.setMaximum(i);
- h.repaint();
- }
- }
這個(gè)看起來(lái)無(wú)意義的操作實(shí)際上有重大的作用。每當(dāng)設(shè)置標(biāo)簽表時(shí)就生成滑塊的標(biāo)簽。沒(méi)有為了修改對(duì)表進(jìn)行特殊回調(diào),所以添加到表中的新值不必產(chǎn)生效果;很顯然,空操作具有使 Swing 知道它必須更新顯示的副作用。(以免您認(rèn)為這是我自己發(fā)明的,請(qǐng)注意最初的 Swing Set示例代碼包括這樣一個(gè)調(diào)用。)
【編輯推薦】