java对话框的设计

对话框是一个从其它窗口弹出的窗口。它的目的是处理一些特殊的争议和它们的细节而不使原来的窗口陷入混乱之中。对话框大量在设置窗口的编程环境中使用,但就像前面提到的一样,鲜于在程序片中使用。
我们需要从对话类处继承以创建其它类型的窗口、像帧一样的对话框。和窗框不同,对话框不能拥有菜单条也不能改变光标,但除此之外它们十分的相似。一个对话框拥有布局管理器(默认的是BorderLayout布局管理器)和过载action()等等,或用handleEvent()去处理事件。我们会注意到handleEvent()的一个重要差异:当WINDOW_DESTORY事件发生时,我们并不希望关闭正在运行的应用程序!
相反,我们可以使用对话窗口通过调用dispace()释放资源。在下面的例子中,对话框是由定义在那儿作为类的ToeButton的特殊按钮组成的网格构成的(利用GridLayout布局管理器)。ToeButton按钮围绕它自已画了一个帧,并且依赖它的状态:在空的中的“X”或者“O”。它从空白开始,然后依靠使用者的选择,转换成“X”或“O”。但是,当我们单击在按钮上时,它会在“X”和“O”之间来回交换。(这产生了一种类似填字游戏的感觉,当然比它更令人讨厌。)另外,这个对话框可以被设置为在主应用程序窗口中为很多的行和列变更号码。
 

//: ToeTest.java
// Demonstration of dialog boxes
// and creating your own components
import java.awt.*;

class ToeButton extends Canvas {
  int state = ToeDialog.BLANK;
  ToeDialog parent;
  ToeButton(ToeDialog parent) {
    this.parent = parent;
  }
  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);
    }
  }
  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);
    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 static 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. 文件对话类
在一些操作系统中拥有许多的特殊内建对话框去处理选择的事件,例如:字库,颜色,打印机以及类似的事件。几乎所有的操作系统都支持打开和保存文件,但是,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.setLayout(new FlowLayout());
    p.add(open);
    p.add(save);
    add("South", p);
    directory.setEditable(false);
    filename.setEditable(false);
    p = new Panel();
    p.setLayout(new GridLayout(2,1));
    p.add(filename);
    p.add(directory);
    add("North", p);
  }
  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(evt.target.equals(open)) {
      // Two arguments, defaults to open file:
      FileDialog d = new FileDialog(this,
        "What file do you want to open?");
      d.setFile("*.java"); // Filename filter
      d.setDirectory("."); // Current directory
      d.show();
      String openFile;
      if((openFile = d.getFile()) != null) {
        filename.setText(openFile);
        directory.setText(d.getDirectory());
      } else {
        filename.setText("You pressed cancel");
        directory.setText("");
      }
    }
    else if(evt.target.equals(save)) {
      FileDialog d = new FileDialog(this,
        "What file do you want to save?",
        FileDialog.SAVE);
      d.setFile("*.java");
      d.setDirectory(".");
      d.show();
      String saveFile;
      if((saveFile = d.getFile()) != null) {
        filename.setText(saveFile);
        directory.setText(d.getDirectory());
      } else {
        filename.setText("You pressed cancel");
        directory.setText("");
      }
    }
    else
      return super.action(evt, arg);
    return true;
  }
  public static void main(String[] args) {
    Frame f = new FileDialogTest();
    f.resize(250,110);
    f.show();
  }
} ///:~

对一个“打开文件”对话框,我们使用构建器设置两个自变量;首先是父窗口句柄,其次是FileDialog标题条的标题。setFile()方法提供一个初始文件名--也许本地操作系统支持通配符,因此在这个例子中所有的.java文件最开头会被显示出来。setDirectory()方法选择文件决定开始的目录(一般而言,操作系统允许用户改变目录)。
show()命令直到对话类关闭才返回。FileDialog对象一直存在,因此我们可以从它那里读取数据。如果我们调用getFile()并且它返回空,这意味着用户退出了对话类。文件名和调用getDirectory()方法的结果都显示在TextFields里。
按钮的保存工作使用同样的方法,除了因为FileDialog而使用不同的构建器。这个构建器设置了三个自变量并且第三的一个自变量必须为FileDialog.SAVE或FileDialog.OPEN。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对话框
, 按钮
, new
, public
, FileDialog
一个
java中带选项的对话框、java 弹出对话框、java 对话框、java文件选择对话框、java 打开文件对话框,以便于您获取更多的相关知识。

时间: 2024-09-20 12:23:50

java对话框的设计的相关文章

Java 23种设计模型详解_java

设计模式(Design Patterns)                                   --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每

java子菜单消失-java中窗体设计的JMenuBar子菜单的问题

问题描述 java中窗体设计的JMenuBar子菜单的问题 JMenu baseDate=new JMenu("基础数据维护"); //menuBar.add(baseDate); //toolBar.add(menuBar); //baseDate.setHideActionText(false); JMenuItem readMana=new JMenuItem("读者信息管理"); JMenuItem bookMana=new JMenuItem("

初学者-java小游戏设计问题(有些冗长,麻烦耐心看完!)

问题描述 java小游戏设计问题(有些冗长,麻烦耐心看完!) 该小游戏是为了实现电脑随机出石头,剪刀,或布,然后玩家根据电脑的要求(赢电脑,输电脑,打平),大致思路是客户端发出指令开始游戏,服务器端接收后随机选择,然后发回给客户端,玩家选择后,服务器做出判断对错.现将游戏的服务器端与客户端贴出,现在的问题是当玩家输入自己的判断后,服务器返回的值一直是"回答错误",求解! 这是 服务器端 的程序 import java.io.*; import java.net.*; import ja

java-求做一个Java类的设计的题

问题描述 求做一个Java类的设计的题 Account类:代表一个银行账户 balance属性:代表账户里的金额 deposit方法:向账户中存钱,如果传入的金额大于0,存钱,返回true,否则不存钱,返回false withdraw方法:从账户中取钱,如果余额够,取钱,返回true,如果余额不足,不取钱,返回false display方法:用于查询当前帐户金额 解决方案 public class Account { private double balance;//定义账户的金额 /** *

从零开始来看一下Java泛型的设计

引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除. 泛型基础 泛型类 我们首先定义一个简单的Box类: public class Box { private String object; public void set(String object) { this.object = object; } public String get() { return object;

《Java程序设计习题精析与实验指导》一第3章 Java的结构化程序设计

第3章 Java的结构化程序设计 3.1 重点复习 3.1.1 顺序结构及基本语句 掌握结构化程序设计的基本概念. 掌握顺序结构流程的执行原理.赋值语句以及输入语句的使用. 3.1.2 选择结构语句 不同选择结构流程的语句形式与执行原理如下所示. (1)if语句 if (表达式) { 语句块 }(2)if-else语句 if (表达式) { 语句块1 } else { 语句块2 }(3)if-else if语句 if(表达式1){ 语句块1 } else if (表达式2){ 语句块2 } -

泛型-java 缓存接口设计疑问。

问题描述 java 缓存接口设计疑问. 我想问,下面两种设计的区别 . 第一种 public interface ICache<T> { T getItem(Serializable key) ; void setItem(Serializable key, T item) ; } 第二种 public interface ILocalCache<K, V> { public V get(K key) ; void setItem(K key, V item) ; } 第一种跟第二

java 代码-Java对话框输入,修改下面代码,若输入不合法,抛出异常并重新输入

问题描述 Java对话框输入,修改下面代码,若输入不合法,抛出异常并重新输入 import javax.swing.*; public class Calendar { public static void main(String[] args) { // Prompt the user to enter input String yearInput = JOptionPane.showInputDialog("Enter a year:"); int year = Integer.p

Java图形用户界面设计(Swing)的介绍_java

前言 Swing是一个用于开发Java应用程序用户界面的开发工具包.它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格.Swing开发人员只用很少的代码就可以利用Swing丰富.灵活的功能和模块化组件来创建优雅的用户界面. Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕显示元素.它们用纯Java写成,所以同Java本