Swing的輸入框仍然分成兩類:單行輸入框和多行輸入框,但與AWT的同類控制項相比,它們在若幹細節上有所調整。首先說單行輸入框,AWT的單行輸入框名叫TextField,平時輸入什麼字元它便顯示什麼字元,可一旦調用了setEchoChar方法設置回顯字元,TextField馬上變成只顯示密文字元了。然 ...
Swing的輸入框仍然分成兩類:單行輸入框和多行輸入框,但與AWT的同類控制項相比,它們在若幹細節上有所調整。首先說單行輸入框,AWT的單行輸入框名叫TextField,平時輸入什麼字元它便顯示什麼字元,可一旦調用了setEchoChar方法設置回顯字元,TextField馬上變成只顯示密文字元了。然而尷尬之處在於,設置回顯字元之後,就沒有辦法取消原來的回顯設置,輸入框對象從此只能傻乎乎地顯示密文了。如此一來,程式代碼難以判斷某個輸入框究竟會顯示明文還是密文,也無法確定輸入框文字的加密與否。這不可避免會造成混淆,假設有幾個控制項都屬於TextField類型,程式員怎知哪個是文本框,哪個又是密碼框?難道要在浩如煙海的代碼中尋找那個該死的setEchoChar方法嗎?
鑒於文本框與密碼框擁有不同的面貌,並不適合使用同一種類型來表達,故而Swing順理成章將它倆拆分為兩類控制項:文本框JTextField與密碼框JPasswordField。前者原樣展示用戶輸入的字元,因而取消了回顯字元設置方法setEchoChar;後者預設將輸入字元顯示為一個個圓點,當然程式員也可以調用setEchoChar方法重新設置回顯字元。經過這麼拆分處理,在Swing中不管輸入普通文本還是輸入密碼,就不必擔心弄錯的情況了。除此之外,JTextField與JPasswordField的其餘方法基本一樣,用起來跟AWT的TextField控制項差不多。比如下麵的代碼例子演示了JTextField的調用過程:
JTextField textField = new JTextField(); // 創建一個單行輸入框 textField.setEditable(true); // 設置輸入框允許編輯 textField.setColumns(11); // 設置輸入框的長度為11個字元 panel.add(textField); // 在面板上添加單行輸入框
運行上述的文本框代碼,彈出如下圖所示的視窗界面,可見一條純粹的文本輸入框。
又如以下代碼演示了密碼框JPasswordField的調用過程:
JPasswordField passwordField = new JPasswordField(); // 創建一個密碼框 passwordField.setEditable(true); // 設置密碼框允許編輯 passwordField.setColumns(6); // 設置密碼框的長度為11個字元 //passwordField.setEchoChar('*'); // 設置密碼框的回顯字元。預設的回顯字元為圓點 panel.add(passwordField); // 在面板上添加密碼框
運行以上的密碼框代碼,彈出如下圖所示的視窗界面,可見密碼框的預設回顯字元是個又圓又大的黑點。
接著說多行輸入框,AWT的多行輸入框名叫TextArea,該控制項有個毛病:用戶往裡面輸入文本,超過一行寬度後不會自動換行,必須用戶按下回車鍵來手動換行。這種設計的使用體驗無疑很糟糕,不能自動換行的話,用戶敲多了回車鍵,肯定要怨聲載道了。好在Swing的JTextArea控制項及時彌補了這個問題,除了囊括TextArea的現有方法,JTextArea還增加了setLineWrap方法用來設置每行是否允許,調用該方法將其值設置為true時,往後輸入的文本一旦超過每行寬度就會自動換到下一行。於是添加了setLineWrap方法的多行輸入框調用代碼示例如下:
JTextArea area = new JTextArea(); // 創建一個多行輸入框 area.setEditable(true); // 設置輸入框允許編輯 area.setColumns(14); // 設置輸入框的長度為14個字元 area.setRows(3); // 設置輸入框的高度為3行字元 area.setLineWrap(true); // 設置每行是否允許摺疊。為true的話,輸入字元超過每行寬度就會自動換行 panel.add(area); // 在面板上添加多行輸入框
運行上面的多行輸入框代碼,彈出如下圖所示的視窗界面,可見輸入框的內部文本的確支持自動換行了。
可是跟AWT的TextArea比起來,Swing的JTextArea預設不顯示滾動條,即使文本的總高度已經超過了輸入框的高度,期望中的滾動條仍未出現。這是因為Swing把滾動條也單獨拎了出來,還給它取了個大名叫做JScrollPane,凡是需要上下滾動或者左右滾動的控制項,都要搭配上JScrollPane才行。滾動條的用法也挺簡單,只要在構造方法中填入待關聯的控制項對象,或者調用滾動條對象的setViewportView方法,都能將滾動條與指定控制項綁定在一起。然後在面板上添加滾動條對象,如此便完成了輸入框與滾動條的綁定操作,具體的綁定代碼如下所示:
JTextArea area = new JTextArea(); // 創建一個多行輸入框 area.setEditable(true); // 設置輸入框允許編輯 area.setColumns(14); // 設置輸入框的長度為14個字元 area.setRows(3); // 設置輸入框的高度為3行字元 area.setLineWrap(true); // 設置每行是否摺疊。為true的話,輸入字元超過每行寬度就會自動換行 // 因為下麵添加滾動條的時候,滾動條已經關聯了JTextArea,所以這裡不必單獨添加多行輸入框 //panel.add(area); // 在面板上添加多行輸入框 JScrollPane scroll = new JScrollPane(area); // 創建一個滾動條 //scroll.setViewportView(area); // 設置滾動條關聯的控制項 panel.add(scroll); // 在面板上添加滾動條
運行上面的滾動條綁定代碼,彈出如下圖所示的視窗界面,此時在輸入框中填入好幾行文本,在文本總高超過控制項高度之後,輸入框右側的滾動條便如約出現了。
更多Java技術文章參見《Java開發筆記(序)章節目錄》