友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

Java编程思想第4版[中文版](PDF格式)-第82部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



这是一个新的输入语句,但此外任何事物除了增加了一些“J”外,看起都像这 Java 1。1 版的AWT。同样, 

我们不恰当的用add()方法增加到 Swing JFrame 中,除此之外我们必须像上面看到的一样先准备一些 

 “content pane”。我们可以容易地得到Swing 一个简单的改变所带来的好处。  

因为程序中的封装语句,我们不得不调用像下面所写的一样调用这个程序:  

java c13。swing。JbuttonDemo  

在这一节里出现的所有的程序都将需要一个相同的窗体来运行它们。  



13。19。3 显示框架  



尽管程序片和应用程序都可以变得很重要,但如果在任何地方都使用它们就会变得混乱和毫无用处。这一节 

余下部分取代它们的是一个Swing 程序例子的显示框架:  

  

//: Show。java  

// Tool for displaying Swing demos  

package c13。swing;  

import java。awt。*;  

import java。awt。event。*;  

import javax。swing。*;  



                                                                                          468 


…………………………………………………………Page 470……………………………………………………………

  

public class Show {  

  public static void   

  inFrame(JPanel jp; int width; int height) {  

    String title = jp。getClass()。toString();  

    // Remove the word 〃class〃:  

    if(title。indexOf(〃class〃) != …1)  

      title = title。substring(6);  

    JFrame frame = new JFrame(title);  

    frame。addWindowListener(new WindowAdapter() {  

      public void windowClosing(WindowEvent e){  

        System。exit(0);  

      }  

    });  

    frame。getContentPane()。add(  

      jp; BorderLayout。CENTER);  

    frame。setSize(width; height);  

    frame。setVisible(true);  

  }  

} ///:~  

  

那些想显示它们自己的类将从 JPanel 处继承并且随后为它们自己增加一些可视化的组件。最后,它们创建一 

个包含下面这一行程序的main():  

Show。inFrame(new MyClass(); 500; 300);  

最后的两个自变量是显示的宽度和高度。  

注意JFrame 的标题是用 RTTI 产生的。  



13。19。4 工具提示  



几乎所有我们利用来创建我们用户接口的来自于Jponent 的类都包含一个称为setToolTipText(string) 

的方法。因此,几乎任何我们所需要表示的(对于一个对象jc 来说就是一些来自Jponent 的类)都可以 

安放在窗体中:  

jc。setToolTipText(〃My tip〃);  

并且当鼠标停在Jponent 上一个超过预先设置的一个时间,一个包含我们的文字的小框就会从鼠标下弹 

出。  



13。19。5 边框  



Jponent 同样包括一个称为 setBorder()的方法,该方法允许我们安放一些各种各样有趣的边框到一些可 

见的组件上。下面的程序例子利用一个创建JPanel 并安放边框到每个例子中的被称为 showBorder()的方 

法,示范了一些有用的不同的边框。同样,它也使用RTTI 来找我们使用的边框名(剔除所有的路径信息), 

然后将边框名放到面板中间的 JLable 里:  

  

//: Borders。java  

// Different Swing borders  

package c13。swing;  

import java。awt。*;  

import java。awt。event。*;  

import javax。swing。*;  

import javax。swing。border。*;  

  

public class Borders extends JPanel {  

  static JPanel showBorder(Border b) {  



                                                                                          469 


…………………………………………………………Page 471……………………………………………………………

    JPanel jp = new JPanel();  

    jp。setLayout(new BorderLayout());  

    String nm = b。getClass()。toString();  

    nm = nm。substring(nm。lastIndexOf('。') + 1);  

    jp。add(new JLabel(nm; JLabel。CENTER);   

      BorderLayout。CENTER);  

    jp。setBorder(b);  

    return jp;  

  }  

  public Borders() {  

    setLayout(new GridLayout(2;4));  

    add(showBorder(new TitledBorder(〃Title〃)));  

    add(showBorder(new EtchedBorder()));  

    add(showBorder(new LineBorder(Color。blue)));  

    add(showBorder (  

      new MatteBorder(5;5;30;30;Color。green)));  

    add(showBorder(  

      new BevelBorder(BevelBorder。RAISED)));  

    add(showBorder(  

      new SoftBevelBorder(BevelBorder。LOWERED)));  

    add(showBorder(new poundBorder(  

      new EtchedBorder();  

      new LineBorder(Color。red))));  

  }  

  public static void main(String args'') {  

    Show。inFrame(new Borders(); 500; 300);  

  }  

} ///:~  

  

这一节中大多数程序例子都使用TitledBorder,但我们可以注意到其余的边框也同样易于使用。能创建我们 

自己的边框并安放它们到按钮、标签等等内——任何来自 Jponent 的东西。  



13。19。6 按钮  



Swing 增加了一些不同类型的按钮,并且它同样可以修改选择组件的结构:所有的按钮、复选框、单选钮, 

甚至从AbstractButton 处继承的菜单项(这是因为菜单项一般被包含在其中,它可能会被改进命名为 

 “AbstractChooser”或者相同的什么名字)。我们会注意使用菜单项的简便,下面的例子展示了不同类型的 

可用的按钮:  

  

//: Buttons。java  

// Various Swing buttons  

package c13。swing;  

import java。awt。*;  

import java。awt。event。*;  

import javax。swing。*;  

import javax。swing。plaf。basic。*;  

import javax。swing。border。*;  

  

public class Buttons extends JPanel {  

  JButton jb = new JButton(〃JButton〃);  

  BasicArrowButton  

    up = new BasicArrowButton(  

      BasicArrowButton。NORTH);  



                                                                                          470 


…………………………………………………………Page 472……………………………………………………………

    down = new BasicArrowButton(  

      BasicArrowButton。SOUTH);  

    right = new BasicArrowButton(  

      BasicArrowButton。EAST);  

    left = new BasicArrowButton(  

      BasicArrowButton。WEST);  

  public Buttons() {  

    add(jb);  

    add(new JToggleButton(〃JToggleButton〃));  

    add(new JCheckBox(〃JCheckBox〃));  

    add(new JRadioButton(〃JRadioButton〃));  

    JPanel jp = new JPanel();  

    jp。setBorder(new TitledBorder(〃Directions〃));  

    jp。add(up);  

    jp。add(down);  

    jp。add(left);  

    jp。add(right);  

    add(jp);  

  }  

  public static void main(String args'') {  

    Show。inFrame(new Buttons(); 300; 200);  

  }  

} ///:~  

  

JButton 看起来像AWT 按钮,但它没有更多可运行的功能(像我们后面将看到的如加入图像等)。在 

。sun。java。swing。basic 里,有一个更合适的 BasicArrowButton 按钮,但怎样测试它呢?有两种类型的 

 “指针”恰好请求箭头按钮使用:Spinner 修改一个中断值,并且 StringSpinner 通过一个字符串数组来移 

动(当它到达数组底部时,甚至会自动地封装)。ActionListeners 附着在箭头按钮上展示它使用的这些相 

关指针:因为它们是Bean ,我们将期待利用方法名,正好捕捉并设置它们的值。  

当我们运行这个程序例子时,我们会发现触发按钮保持它最新状态,开或时关。但复选框和单选钮每一个动 

作都相同,选中或没选中(它们从 JToggleButton 处继承)。  



13。19。7 按钮组  



如果我们想单选钮保持“异或”状态,我们必须增加它们到一个按钮组中,这几乎同老AWT 中的方法相同但 

更加的灵活。在下面将要证明的程序例子是,一些 AbstruactButton 能被增加到一个ButtonGroup 中。  

为避免重复一些代码,这个程序利用映射来生不同类型的按钮组。这会在 makeBPanel 中看到,makeBPanel 

创建了一个按钮组和一个JPanel,并且为数组中的每个 String 就是makeBPanel 的第二个自变量增加一个类 

对象,由它的第一个自变量进行声明:  

  

//: ButtonGroups。java  

// Uses reflection to create groups of different  

// types of AbstractButton。  

package c13。swing;  

import java。awt。*;  

import java。awt。event。*;  

import javax。swing。*;  

import javax。swing。border。*;  

import java。lang。reflect。*;  

  

public class ButtonGroups extends JPanel {  

  static String'' ids = {   

    〃June〃; 〃Ward〃; 〃Beaver〃;   



                                                                                          471 


…………………………………………………………Page 473……………………………………………………………

    〃Wally〃; 〃Eddie〃; 〃Lumpy〃;  

  };  

  static JPanel   

  makeBPanel(Class bClass; String'' ids) {  

    ButtonGroup bg = new ButtonGroup();  

    JPanel jp = new JPanel();  

    String title = bClass。getName();  

    title = title。substring(  

      title。lastIndexOf('。') + 1);  

    jp。setBorder(new TitledBorder(title));  

    for(int i = 0; i 《 ids。length; i++) {  

      AbstractButton ab = new JButton(〃failed〃);  

      try {  

        // Get the dynamic constructor method  

        // that takes a String argument:  

        Constructor ctor = bClass。getConstructor(  

          new Class'' { String。class });  

        // Create a new object:  

        ab = (AbstractButton)ctor。newInstance(  

          new Object''{ids'i'});  

      } catch(Exception ex) {  

        System。out。println(〃can't create 〃 +   

          bClass);  

      }  

      bg。add(ab);  

      jp。add(ab);  

    }  

    return jp;  

  }  

  public ButtonGroups() {  

    add(makeBPanel(JButton。class; ids));  

    add(makeBPanel(JToggleButton。class; ids));  

    add(makeBPanel(JCheckBox。class; ids));  

    add(makeBPanel(JRadioButton。class; ids));  

  }  

  public static void main(String args'') {  

    Show。inFrame(new ButtonGroups(); 500; 300);  

  }  

} ///:~  

  

边框标题由类名剔除了所有的路径信息而来。AbstractButton 初始化为一个 JButton,JButtonr 的标签发生 

 “失效”,因此如果我们忽略这个异常信息,我们会在屏幕上一直看到这个问题。getConstructor()方法产 

生了一个通过getConstructor()方法安放自变量数组类型到类数组的构建器对象,然后所有我们要做的就是 

调用newInstance() ,通过它一个数组对象包含我们当前的自变量——在这种例子中,就是 ids 数组中的字 

符串。  

这样增加了一些更复杂的内容到这个简单的程序中。为了使“异或”行为拥有按钮,我们创建一个按钮组并 

增加每个按钮到我们所需的组中。当我们运行这个程序时,我们会注意到所有的按钮除了JButton 都会向我 

们展示“异或”行为。  



13。19。8  图标  



我们可在一个JLable 或从AbstractButton 处继承的任何事物中使用一个图标(包括 JButton,JCheckbox , 

JradioButton 及不同类型的 JMenuItem)。利用JLables 的图标十分的简单容易(我们会在随后的一个程序例 



                                                                                          472 


…………………………………………………………Page 474……………………………………………………………

子中看到)。下面的程序例子探索了我们可以利用按钮的图标和它们的衍生物的其它所有方法。  

我们可以使用任何我们需要的 GIF 文件,但在这个例子中使用的这个 GIF 文件是这本书编码发行的一部分, 

可以在BruceEckel。 处下载来使用。为了打开一个文件和随之带来的图像,简单地创建一个图标并分 

配它文件名。从那时起,我们可以在程序中使用这个产生的图标。  

  

//: Faces。java  

// Icon behavior in JButtons  

package c13。swing;  

import java。awt。*;  

import java。awt。event。*;  

import javax。swing。*;  

  

public class Faces extends JPanel {  

  static Icon'' faces = {  

    new ImageIcon(〃face0。gif〃);  

    new ImageIcon(〃face1。gif〃);  

    new ImageIcon(〃face2。gif〃);  

    new ImageIcon(〃face3。gif〃);  

    new ImageIcon(〃face4。gif〃);  

  };  

  JButton   

    jb = new JButton(〃JButton〃; faces'3');   

    jb2 = new JButton(〃Disable〃);  

  boolean mad = false;  

  public Faces() {  

    jb。addActionListener(new ActionListener() {  

      public void actionPerformed(ActionEvent e){  

        if(mad) {  

          jb。setIcon(faces'3');  

          mad = false;  

        } else {  

          jb。setIcon(faces'0');  

          mad = true;  

        }  

        jb。setVerticalAlignment(JButton。TOP);  

        jb。setHorizontalAlignment(JButton。LEFT);  

      }  

    });  

    jb。setRolloverEnabled(true);  

    jb。setRolloverIcon(faces'1');  

    jb。setPressedIcon(faces'2');  

    jb。setDisabledIcon(faces'4');  

    jb。setToolTipText(〃Yow!〃);  

    add(jb);  

    jb2。addActionListener(new ActionListener() {  

      public void actionPerformed(ActionEvent e){  

        if(jb。isEnabled()) {  

          jb。setEnabled(false);  

          jb2。setText(〃Enable〃);  

        } else {  

          jb。setEnabled(true);  

          jb2。setText(〃Disable〃);  



                                                                                          473 


…………………………………………………………Page 475……………………………………………………………

        }  

      }  

    });  

    add(jb2);  

  }  

  public static void main(String args'') {  

    Show。inFrame(new Faces(); 300; 200);  

  }  

} ///:~  

  

一个图标可以在许多的构建器中使用,但我们可以使用setIcon()方法增加或更换图标。这个例子同样展示 

了当事件发生在JButton (或者一些AbstractButton)上时,为什么它可以设置各种各样的显示图标:当 

JButton 被按下时,当它被失效时,或者“滚过”时(鼠标从它上面移动过但并不击它)。我们会注意到那 

给了按钮一种动画的感觉。  

注意工具提示条也同样增加到按钮中。  



13。19。9 菜单  



菜单在 Swing 中做了重要的改进并且更加的灵活——例如,我们可以在几乎程序中任何地方使用他们,包括 

在面板和程序片中。语法同它们在老的AWT 中是一样的,并且这样使出现在老AWT 的在新的Swing 也出现 

了:我们必须为我们的菜单艰难地编写代码,并且有一些不再作为资源支持菜单(其它事件中的一些将使它 

们更易转换成其它的编程语言)。另外,菜单代码相当的冗长,有时还有一些混乱。下面的方法是放置所有 

的关于每个菜单的信息到对象的二维数组里(这种方法可以放置我们想处理的任何事物到数组里),这种方 

法在解决这个问题方面领先了一步。这个二维数组被菜单所创建,因此它首先表示出菜单名,并在剩余的列 

中表示菜单项和它们的特性。我们会注意到数组列不必保持一致——只要我们的代码知道将发生的一切事 

件,每一列都可以完全不同。  

  

//: Menus。java  

// A menu…building system; also demonstrates  

// icons in labels and menu items。  

package c13。swing;  

import java。awt。*;  

import java。awt。event。*;  

import javax。swing。*;  

  

public class Menus extends JPanel {  

  static final Boolean  

    bT = new Boolean(true);   

    bF = new Boolean(false);  

  // Dummy class to create type identifiers:  

  static class MType { MType(int i) {} };  

  static final MType  

    mi = new MType(1); // Normal menu item  

    cb = new MType(2); // Checkbox menu item  

    rb = new MType(3); // Radio button menu item  

  JTextField t = new JTextField(10);  

  JLabel l = new JLabel(〃Icon Selected〃;   

    Faces。faces'0'; JLabel。CENTER);  

  ActionListener a1 = new ActionListener() {  

    public void actionPerformed(ActionEvent e) {  

      t。setText(  

        ((JMenuItem)e。getSource())。getText());  

    }  



                                                                                          474 


…………………………………………………………Page 476……………………………………………………………

  };  

  ActionListener a2 = new ActionListener() {  

    public void actionPerformed(ActionEvent e) {  

      JMenuItem mi = (JMenuItem)e。getSource();  

      l。setText(mi。getText());  

      l。setIcon(mi。getIcon());  

    }  

  };  

  // Store menu data as 〃resources〃:  

  public Object'''' fileMenu = {  

    // Menu name and accelerator:  

    { 〃File〃; new Character('F') };  

    // Name type accel listener enabled  

    { 〃New〃; mi; new Character('N'); a1; bT };  

    { 〃Open〃; mi; new Character('O'); a1; bT };  

    { 〃Save〃; mi; new Character('S'); a1; bF };  

    { 〃Save As〃; mi; new Character('A'); a1; bF};  

    { null }; // Separator  

    { 〃Exit〃; mi; new Character('x'); a1; bT };  

  };  

  public Object'''' editMenu = {  

    // Menu name:  

    { 〃Edit〃; new Character('E') };  

    // Name type accel listener enabled  

    { 〃Cut〃; mi; new Character('t'); a1; bT };  

    { 〃Copy〃; mi; new C
返回目录 上一页 下一页 回到顶部 10 9
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!