按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
}
public void paint(Graphics g) {
int x1 = 0;
int y1 = 0;
int x2 = size()。width 1;
int y2 = size()。height 1;
g。drawRect(x1; y1; x2; y2);
x1 = x2/4;
y1 = y2/4;
int wide = x2/2;
int high = y2/2;
if(state == ToeDialog。XX) {
g。drawLine(x1; y1; x1 + wide; y1 + high);
g。drawLine(x1; y1 + high; x1 + wide; y1);
}
if(state == ToeDialog。OO) {
g。drawOval(x1; y1; x1+wide/2; y1+high/2);
404
…………………………………………………………Page 406……………………………………………………………
}
}
public boolean
mouseDown(Event evt; int x; int y) {
if(state == ToeDialog。BLANK) {
state = parent。turn;
parent。turn= (parent。turn == ToeDialog。XX ?
ToeDialog。OO : ToeDialog。XX);
}
else
state = (state == ToeDialog。XX ?
ToeDialog。OO : ToeDialog。XX);
repaint();
return true;
}
}
class ToeDialog extends Dialog {
// w = number of cells wide
// h = number of cells high
static final int BLANK = 0;
static final int XX = 1;
static final int OO = 2;
int turn = XX; // Start with x's turn
public ToeDialog(Frame parent; int w; int h) {
super(parent; 〃The game itself〃; false);
setLayout(new GridLayout(w; h));
for(int i = 0; i 《 w * h; i++)
add(new ToeButton(this));
resize(w * 50; h * 50);
}
public boolean handleEvent(Event evt) {
if(evt。id == Event。WINDOW_DESTROY)
dispose();
else
return super。handleEvent(evt);
return true;
}
}
public class ToeTest extends Frame {
TextField rows = new TextField(〃3〃);
TextField cols = new TextField(〃3〃);
public ToeTest() {
setTitle(〃Toe Test〃);
Panel p = new Panel();
p。setLayout(new GridLayout(2;2));
p。add(new Label(〃Rows〃; Label。CENTER));
p。add(rows);
p。add(new Label(〃Columns〃; Label。CENTER));
p。add(cols);
add(〃North〃; p);
405
…………………………………………………………Page 407……………………………………………………………
add(〃South〃; new Button(〃go〃));
}
public boolean handleEvent(Event evt) {
if(evt。id == Event。WINDOW_DESTROY)
System。exit(0);
else
return super。handleEvent(evt);
return true;
}
public boolean action(Event evt; Object arg) {
if(arg。equals(〃go〃)) {
Dialog d = new ToeDialog(
this;
Integer。parseInt(rows。getText());
Integer。parseInt(cols。getText()));
d。show();
}
else
return super。action(evt; arg);
return true;
}
public stat ic void main(String'' args) {
Frame f = new ToeTest();
f。resize(200;100);
f。show();
}
} ///:~
ToeButton 类保留了一个句柄到它 ToeDialog 型的父类中。正如前面所述,ToeButton 和 ToeDialog 高度的结
合因为一个 ToeButton 只能被一个ToeDialog 所使用,但它却解决了一系列的问题,事实上这实在不是一个
糟糕的解决方案因为没有另外的可以记录用户选择的对话类。当然我们可以使用其它的制造ToeDialog。turn
(ToeButton 的静态的一部分)方法。这种方法消除了它们的紧密联系,但却阻止了我们一次拥有多个
ToeDialog (无论如何,至少有一个正常地运行)。
paint()是一种与图形有关的方法:它围绕按钮画出矩形并画出“X”或“O”。这完全是冗长的计算,但却
十分的直观。
一个鼠标单击被过载的 mouseDown()方法所俘获,最要紧的是检查是否有事件写在按钮上。如果没有,父窗
口会被询问以找出谁选择了它并用来确定按钮的状态。值得注意的是按钮随后交回到父类中并且改变它的选
择。如果按钮已经显示这为“X”和“O”,那么它们会被改变状态。我们能注意到本书第三章中描述的在
这些计算中方便的使用的三个一组的 If…else。当一个按钮的状态改变后,按钮会被重画。
ToeDialog 的构建器十分的简单:它像我们所需要的一样增加一些按钮到 GridLayout 布局管理器中,然后调
整每个按钮每边大小为 50 个像素(如果我们不调整窗口,那么它就不会显示出来)。注意 handleEvent()正
好为WINDOW_DESTROY 调用dispose(),因此整个应用程序不会被关闭。
ToeTest 设置整个应用程序以创建 TextField (为输入按钮网格的行和列)和“go”按钮。我们会领会
action()在这个程序中使用不太令人满意的“字符串匹配”技术来测试按钮的按下(请确定我们拼写和大写
都是正确的!)。当按钮按下时,TextField 中的数据将被取出,并且,因为它们在字符串结构中,所以需
要利用静态的 Integer。paresInt()方法来转变成中断。一旦对话类被建立,我们就必须调用 show()方法来显
示和激活它。
我们会注意到ToeDialog 对象赋值给一个对话句柄 d。这是一个上溯造型的例子,尽管它没有真正地产生重
要的差异,因为所有的事件都是show()调用的。但是,如果我们想调用ToeDialog 中已经存在的一些方法,
我们需要对 ToeDialog 句柄赋值,就不会在一个上溯中丢失信息。
1。 文件对话类
406
…………………………………………………………Page 408……………………………………………………………
在一些操作系统中拥有许多的特殊内建对话框去处理选择的事件,例如:字库,颜色,打印机以及类似的事
件。几乎所有的操作系统都支持打开和保存文件,但是,Java 的FileDialog 包更容易使用。当然这会不再
检测所有使用的程序片,因为程序片在本地磁盘上既不能读也不能写文件。(这会在新的浏览器中交换程序
片的信任关系。)
下面的应用程序运用了两个文件对话类的窗体,一个是打开,一个是保存。大多数的代码到如今已为我们所
熟悉,而所有这些有趣的活动发生在两个不同按钮单击事件的 action()方法中。
//: FileDialogTest。java
// Demonstration of File dialog boxes
import java。awt。*;
public class FileDialogTest extends Frame {
TextField filename = new TextField();
TextField directory = new TextField();
Button open = new Button(〃Open〃);
Button save = new Button(〃Save〃);
public FileDialogTest() {
setTitle(〃File Dialog Test〃);
Panel p = new Panel();
p。s