
我們將 EncryptorGUI 改成用 inner 類別來實作傾聽者介面 (interface) ,如下
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 + "\'");
}
}
}
/* 《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名:EncryptorGUI.java
功能:示範 Java 程式
作者:張凱慶
時間:西元 2011 年 4 月 */inner 類別在第 100 行到第 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) ,所以
public EncryptorGUI() { 就不需要 implements ActionListener 與 CaretListener 了。然後 JTextField 登記方面
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 月訂正
沒有留言:
張貼留言