友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第179章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!