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

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

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




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