
我們將 EncryptorGUI 改成用 inner 類別來實作傾聽者介面 (interface) ,如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.util.*; public class EncryptorGUI { private JFrame frame; private String[] name; private int att[][]; private ArrayList<JComponent> GUIComponent; private String userinput; public EncryptorGUI() { int fill[] = { GridBagConstraints.BOTH, GridBagConstraints.VERTICAL, GridBagConstraints.HORIZONTAL, GridBagConstraints.NONE}; int anchor[] = { GridBagConstraints.CENTER, GridBagConstraints.EAST, GridBagConstraints.SOUTHEAST, GridBagConstraints.SOUTH, GridBagConstraints.SOUTHWEST, GridBagConstraints.WEST, GridBagConstraints.NORTHWEST, GridBagConstraints.NORTH, GridBagConstraints.NORTHEAST}; String n[] = { "Input" , "Output" , "hint..." , "New" , "Load" , "Save" , "Encode" , "Decode" , "Clear" , "Copy" }; name = n; int a[][] = {{ 0 , 0 , 1 , 1 , 0 , 0 , fill[ 3 ], anchor[ 5 ]}, { 0 , 1 , 1 , 1 , 0 , 0 , fill[ 3 ], anchor[ 5 ]}, { 0 , 3 , 7 , 1 , 0 , 0 , fill[ 3 ], anchor[ 5 ]}, { 1 , 0 , 6 , 1 , 0 , 0 , fill[ 0 ], anchor[ 5 ]}, { 1 , 1 , 6 , 1 , 0 , 0 , fill[ 0 ], anchor[ 5 ]}, { 0 , 2 , 1 , 1 , 0 , 0 , fill[ 0 ], anchor[ 0 ]}, { 1 , 2 , 1 , 1 , 0 , 0 , fill[ 0 ], anchor[ 0 ]}, { 2 , 2 , 1 , 1 , 0 , 0 , fill[ 0 ], anchor[ 0 ]}, { 3 , 2 , 1 , 1 , 0 , 0 , fill[ 0 ], anchor[ 0 ]}, { 4 , 2 , 1 , 1 , 0 , 0 , fill[ 0 ], anchor[ 0 ]}, { 5 , 2 , 1 , 1 , 0 , 0 , fill[ 0 ], anchor[ 0 ]}, { 6 , 2 , 1 , 1 , 0 , 0 , fill[ 0 ], anchor[ 0 ]}}; att = a; frame = new JFrame(); GUIComponent = new ArrayList<JComponent>( 12 ); } public void run() { frame.setSize( 600 , 160 ); frame.setLayout( new GridBagLayout()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); int i; for (i = 0 ; i < 3 ; i++) { JLabel nLabel = new JLabel(name[i]); GUIComponent.add(nLabel); } for (i = 0 ; i < 2 ; i++) { JTextField nText = new JTextField( "" , 32 ); GUIComponent.add(nText); } for (i = 3 ; i < 10 ; i++) { JButton nButton = new JButton(name[i]); GUIComponent.add(nButton); } for (i = 0 ; i < GUIComponent.size(); i++) { addComponent(i); } JTextField t = (JTextField) GUIComponent.get( 3 ); t.addActionListener( new InputListener()); t.addCaretListener( new InputListener()); frame.setVisible( true ); } private void addComponent( int i) { GridBagConstraints c = new GridBagConstraints(); int a[] = att[i]; c.gridx = a[ 0 ]; c.gridy = a[ 1 ]; c.gridwidth = a[ 2 ]; c.gridheight = a[ 3 ]; c.weightx = a[ 4 ]; c.weighty = a[ 5 ]; c.fill = a[ 6 ]; c.anchor = a[ 7 ]; frame.add(GUIComponent.get(i), c); } class InputListener implements ActionListener, CaretListener { public void actionPerformed(ActionEvent event) { JTextField t2 = (JTextField) GUIComponent.get( 3 ); userinput = t2.getText(); JLabel t1 = (JLabel) GUIComponent.get( 2 ); t1.setText( "This is Input textfield. Your input is \'" + userinput + "\'" ); } public void caretUpdate(CaretEvent event) { JTextField t2 = (JTextField) GUIComponent.get( 3 ); userinput = t2.getText(); JLabel t1 = (JLabel) GUIComponent.get( 2 ); t1.setText( "This is Input textfield. Your input is \'" + userinput + "\'" ); } } } /* 《程式語言教學誌》的範例程式 檔名:EncryptorGUI.java 功能:示範 Java 程式 作者:張凱慶 時間:西元 2011 年 4 月 */ |
inner 類別在第 100 行到第 116 行的地方
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | class InputListener implements ActionListener, CaretListener { public void actionPerformed(ActionEvent event) { JTextField t2 = (JTextField) GUIComponent.get( 3 ); userinput = t2.getText(); JLabel t1 = (JLabel) GUIComponent.get( 2 ); t1.setText( "This is Input textfield. Your input is \'" + userinput + "\'" ); } public void caretUpdate(CaretEvent event) { JTextField t2 = (JTextField) GUIComponent.get( 3 ); userinput = t2.getText(); JLabel t1 = (JLabel) GUIComponent.get( 2 ); t1.setText( "This is Input textfield. Your input is \'" + userinput + "\'" ); } } |
InputListener 為實作接收使用者輸入的文字方塊 (textfield) 的傾聽者介面類別,因之取名為 InputListener 。因為 ActionListener 與 CaretListener 在這裡實作 (implement) ,所以
7 | public EncryptorGUI() { |
就不需要 implements ActionListener 與 CaretListener 了。然後 JTextField 登記方面
78 79 80 | JTextField t = (JTextField) GUIComponent.get( 3 ); t.addActionListener( new InputListener()); t.addCaretListener( new InputListener()); |
這裡改成新建的 InputListener 物件 (object) 。請讀者自行重新編譯 EncryptorGUI ,然後呼叫執行 EncryptorGUIDemo 看看,效果會是一樣的。雖然 inner 類別還有很多細節需要學習,就目前我們的例子而言,認識 GUI 事件處理的部份就夠了 :)
接下來,我們要開始整合 Encrypt 到 EncryptorGUI 中囉!
中英文術語對照 | |
---|---|
inner 類別 | inner class |
類別 | class |
介面 | interface |
文字方塊 | textfield |
實作 | implement |
物件 | object |
您可以繼續參考
GUI 篇
相關目錄
回 Java 入門指南
回 Java 教材目錄
回首頁
參考資料
The JavaTM Tutorials: Getting Started
The JavaTM Tutorials: Learning the Java Language
The JavaTM Tutorials: Essential Classes
The Java Language Specification, Third Edition
本文於 2013 年 1 月訂正
沒有留言:
張貼留言