在看thinking in java,讲关于 awt的历史,在java 1.0的时候,awt的设计是非常糟糕,但是AWT1.1的设计思想确实非常优秀的。
看一些实例,虽然 awt 现在已经不用,但是里面的一些设计思想还是值得学习的
【案例1】 按钮 内部类
package awt.test;
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class Button2New extends Applet
{
Button b1 = new Button("button 1");
Button b2 = new Button("button 2");
@Override
public void init()
{
b1.addActionListener(new B1());
b2.addActionListener(new B2());
add(b1);
add(b2);
}
//不同的内部类监听不同的事件
//内部类需要执行actionListener
//执行这个接口,需要实现里面的方法
//actionPerformed
class B1 implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
getAppletContext().showStatus("i am button 1");
}
}
class B2 implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
getAppletContext().showStatus("i am button2");
}
}
}
一旦知道了一个特定的组件支持哪些事件,就不必再去寻找任何东西来响应那个事件。只需简单地:
(1) 取得事件类的名字,并删掉其中的“Event”字样。在剩下的部分加入“Listener”字样。这就是在我们 的内部类里需要实现的接收器接口。
(2) 实现上面的接口,针对想要捕获的事件编写方法代码。例如,假设我们想捕获鼠标的移动,所以需要为 MouseMotiionListener接口的 mouseMoved()方法编写代(当然还必须实现其他一些方法,但这里有捷径可 循,马上就会讲到这个问题)。
(3) 为步骤 2中的接收器类创建一个对象。随自己的组件和方法完成对它的注册,方法是在接收器的名字里 加入一个前缀“add”。比如 addMouseMotionListener()。
【案例2】 同时作为应用程序和程序片使用:
package awt.test;
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class Button2New extends Applet
{
Button b1 = new Button("button 1");
Button b2 = new Button("button 2");
TextField t = new TextField(20);
@Override
public void init()
{
b1.addActionListener(new B1());
b2.addActionListener(new B2());
add(b1);
add(b2);
add(t);
}
// 不同的内部类监听不同的事件
// 内部类需要执行actionListener
// 执行这个接口,需要实现里面的方法
// actionPerformed
class B1 implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
getAppletContext().showStatus("i am button 1");
}
}
class B2 implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
getAppletContext().showStatus("i am button2");
}
}
static class WL extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
public static void main(String[] args)
{
Button2New applet = new Button2New();
Frame aFrame = new Frame("Button2NewB");
aFrame.addWindowListener(new WL());
aFrame.add(applet, BorderLayout.CENTER);
aFrame.setSize(300, 200);
applet.init();
applet.start();
aFrame.setVisible(true);
}
}
【案例3】 匿名类
aFrame.addWindowListener( new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{ System.exit(0);
}
});
【案例4 】文本字段
package awt.test;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TextNew extends Applet
{
// 1. 创建2个按钮
Button b1 = new Button("Get Text");
Button b2 = new Button("Set Text");
// 2. 创建三个文本框
TextField t1 = new TextField(30);
TextField t2 = new TextField(30);
TextField t3 = new TextField(30);
// 3. 创建一个字符串s
String s = new String();
// 4. 初始化init,增加事件监控
@Override
public void init()
{
b1.addActionListener(new B1());
b2.addActionListener(new B2());
t1.addTextListener(new T1());
t1.addActionListener(new T1A());
t1.addKeyListener(new T1K());
add(b1);
add(b2);
add(t1);
add(t2);
add(t3);
}
// 5. 监听事件,实现方法,执行想要的操作
class B1 implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
s = t1.getSelectedText();
if (s.length() == 0)
s = t1.getText();
t1.setEditable(true);
}
}
class B2 implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
t1.setText("Inserted by Button 2: " + s);
t1.setEditable(false);
}
}
class T1 implements TextListener
{
public void textValueChanged(TextEvent e)
{
t2.setText(t1.getText());
}
}
class T1A implements ActionListener
{
private int count = 0;
public void actionPerformed(ActionEvent e)
{
t3.setText("t1 Action Event " + count++);
}
}
class T1K extends KeyAdapter
{
public void keyTyped(KeyEvent e)
{
String ts = t1.getText();
if (e.getKeyChar() == KeyEvent.VK_BACK_SPACE)
{
if (ts.length() > 0)
{
ts = ts.substring(0, ts.length() - 1);
t1.setText(ts);
}
} else
t1.setText(t1.getText() + Character.toUpperCase(e.getKeyChar()));
t1.setCaretPosition(t1.getText().length());
e.consume();
}
}
// main
public static void main(String[] args)
{
TextNew applet = new TextNew();
Frame aFrame = new Frame("TextNew");
aFrame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
aFrame.add(applet, BorderLayout.CENTER);
aFrame.setSize(300, 200);
applet.init();
applet.start();
aFrame.setVisible(true);
}
}
正像我们看到的,这十分方便(注释⑥)。
⑥:它也解决了“回调”的问题,不必为 Java 加入任何令人恼火的“方法指针”特性。
【案例5】 文本区域
package awt.test;
//文本区域
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class TextAreaNew extends Applet
{
Button b1 = new Button("Text Area 1");
Button b2 = new Button("Text Area 2");
Button b3 = new Button("Replace Text");
Button b4 = new Button("Insert Text");
TextArea t1 = new TextArea("aaa", 1, 30);
TextArea t2 = new TextArea("t2", 4, 30);
TextArea t3 = new TextArea("t3", 1, 30, TextArea.SCROLLBARS_NONE);
TextArea t4 = new TextArea("t4", 10, 10, TextArea.SCROLLBARS_VERTICAL_ONLY);
TextArea t5 = new TextArea("t5", 4, 30, TextArea.SCROLLBARS_HORIZONTAL_ONLY);
TextArea t6 = new TextArea("twww6", 10, 10,TextArea.SCROLLBARS_BOTH);
public void init()
{
b1.addActionListener(new B1L());
add(b1);
add(t1);
b2.addActionListener(new B2L());
add(b2);
add(t2);
b3.addActionListener(new B3L());
add(b3);
b4.addActionListener(new B4L());
add(b4);
add(t3);
add(t4);
add(t5);
add(t6);
}
class B1L implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
t5.append(t1.getText() + "\n");
}
}
class B2L implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
t2.setText("Inserted by Button 2");
t2.append(": " + t1.getText());
t5.append(t2.getText() + "\n");
}
}
class B3L implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String s = " Replacement ";
t2.replaceRange(s, 3, 3 + s.length());
}
}
class B4L implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
t2.insert(" Inserted ", 10);
}
}
public static void main(String[] args)
{
TextAreaNew applet = new TextAreaNew();
Frame aFrame = new Frame("TextAreaNew");
aFrame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
aFrame.add(applet, BorderLayout.CENTER);
aFrame.setSize(300, 725);
applet.init();
applet.start();
aFrame.setVisible(true);
}
}
我们发现只能在构造TextArea 时能够控制滚动条。同样,即使TE AR 没有滚动条,我们滚动光标也将被制止 (可通过运行这个例子中验证这种行为)。
【案例6】 复选框和单选钮
package awt.test;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class RadioCheckNew extends Applet
{
TextField t = new TextField(30);
Checkbox[] cb =
{
new Checkbox("Check Box 1"),
new Checkbox("Check Box 2"),
new Checkbox("Check Box 3")
};
CheckboxGroup g = new CheckboxGroup();
Checkbox cb4 = new Checkbox("four", g, false);
Checkbox cb5 = new Checkbox("five",g, true);
Checkbox cb6 = new Checkbox("six", g, false);
public void init()
{
t.setEditable(false);
add(t);
ILCheck il = new ILCheck();
for (int i = 0; i < cb.length; i++)
{
cb[i].addItemListener(il);
add(cb[i]);
}
cb4.addItemListener(new IL4());
cb5.addItemListener(new IL5());
cb6.addItemListener(new IL6());
add(cb4);
add(cb5);
add(cb6);
}
class ILCheck implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
for (int i = 0; i < cb.length; i++)
{
System.out.println("e.resource"+e.getSource());
if (e.getSource().equals(cb[i]))
{
t.setText("Check box " + (i + 1));
return;
}
}
}
}
class IL4 implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
t.setText("Radio button four");
}
}
class IL5 implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
t.setText("Radio button five");
}
}
class IL6 implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
t.setText("Radio button six");
}
}
public static void main(String[] args)
{
RadioCheckNew applet = new RadioCheckNew();
Frame aFrame = new Frame("RadioCheckNew");
aFrame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
aFrame.add(applet, BorderLayout.CENTER);
aFrame.setSize(300, 200);
applet.init();
applet.start();
aFrame.setVisible(true);
}
}
ILCheck拥有当我们增加或者减少复选框时自动调整的优点。
当然,我们对单选钮使用这种方法也同样的 好。但是,它仅当我们的逻辑足以普遍的支持这种方法时才会被使用。如果声明一个确定的信号——我们将 重复利用独立的接收器类,否则我们将结束一串条件语句
【案例7】 下拉列表
package awt.test;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class ChoiceNew extends Applet
{
String[] description =
{ "Ebullient", "Obtuse", "Recalcitrant", "Brilliant", "Somnescent",
"Timorous", "Florid", "Putrescent" };
TextField t = new TextField(100);
Choice c = new Choice();
Button b = new Button("Add items");
int count = 0;
public void init()
{
t.setEditable(false);
for (int i = 0; i < 4; i++)
c.addItem(description[count++]);
add(t);
add(c);
add(b);
c.addItemListener(new CL());
b.addActionListener(new BL());
}
class CL implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
System.out.println(c.getSelectedIndex());
System.out.println(c.getSelectedItem()+ c.getSize());
System.out.println(c.getClass());
t.setText("index: " + c.getSelectedIndex() + " " + e.toString());
}
}
class BL implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (count < description.length)
c.addItem(description[count++]);
}
}
public static void main(String[] args)
{
ChoiceNew applet = new ChoiceNew();
Frame aFrame = new Frame("ChoiceNew");
aFrame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
aFrame.add(applet, BorderLayout.CENTER);
aFrame.setSize(750, 100);
applet.init();
applet.start();
aFrame.setVisible(true);
}
}
关于下拉列表,很多程序中实现的原理都是一样,AWT 1.1 这里面有没有什么特殊的。
【案例8】 列表
package awt.test;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.List;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ListNew extends Applet
{
// 1.创建一个字符串
String[] flavors =
{ "Chocolate", "Strawberry", "Vanilla Fudge Swirl", "Mint Chip",
"Mocha Almond Fudge", "Rum Raisin", "Praline Cream", "Mud Pie" };
// 2. 创建一个List
List list = new List(6, true);
// 3. 创建一个textarea
TextArea textArea = new TextArea(flavors.length, 30);
// 4. 创建一个button
Button button = new Button("test");
// 5. 创建一个计数int
int count = 0;
// 6.初始化init
@Override
public void init()
{
textArea.setEditable(false);
for (int i = 0; i < 4; i++)
{
list.add(flavors[count++]);
}
add(button);
add(list);
add(list);
list.addItemListener(new LL());
button.addActionListener(new BL());
}
// 7. 列表的监听
class LL implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
textArea.setText("");
String[] items = list.getSelectedItems();
for (int i = 0; i < items.length; i++)
textArea.append(items[i] + "\n");
}
}
// 8.按钮的监听
class BL implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (count < flavors.length)
list.addItem(flavors[count++], 0);
}
}
// 9.main
public static void main(String[] args)
{
ListNew applet = new ListNew();
Frame aFrame = new Frame("ListNew");
aFrame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
aFrame.add(applet, BorderLayout.CENTER);
aFrame.setSize(300, 200);
applet.init();
applet.start();
aFrame.setVisible(true);
}
}
我们可以注意到在列表项中无需特别的逻辑需要去支持一个单击动作。我们正好像我们在其它地方所做的那 样附加上一个接收器。
【案例9】