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

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

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



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

    { 〃Copy〃; mi; new Character('C'); a1; bT };  

    { 〃Paste〃; mi; new Character('P'); a1; bT };  

    { null }; // Separator  

    { 〃Select All〃; mi;new Character('l');a1;bT};  

  };  

  public Object'''' helpMenu = {  

    // Menu name:  

    { 〃Help〃; new Character('H') };  

    // Name type accel listener enabled  

    { 〃Index〃; mi; new Character('I'); a1; bT };  

    { 〃Using help〃; mi;new Character('U');a1;bT};  

    { null }; // Separator  

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

  };  

  public Object'''' optionMenu = {  

    // Menu name:  

    { 〃Options〃; new Character('O') };  

    // Name type accel listener enabled  

    { 〃Option 1〃; cb; new Character('1'); a1;bT};  

    { 〃Option 2〃; cb; new Character('2'); a1;bT};  

  };  

  public Object'''' faceMenu = {  

    // Menu name:  

    { 〃Faces〃; new Character('a') };  

    // Optinal last element is icon  

    { 〃Face 0〃; rb; new Character('0'); a2; bT;   

      Faces。faces'0' };  



                                                                                       475 


…………………………………………………………Page 477……………………………………………………………

    { 〃Face 1〃; rb; new Character('1'); a2; bT;   

      Faces。faces'1' };  

    { 〃Face 2〃; rb; new Character('2'); a2; bT;   

      Faces。faces'2' };  

    { 〃Face 3〃; rb; new Character('3'); a2; bT;   

      Faces。faces'3' };  

    { 〃Face 4〃; rb; new Character('4'); a2; bT;   

      Faces。faces'4' };  

  };  

  public Object'' menuBar = {  

    fileMenu; editMenu; faceMenu;   

    optionMenu; helpMenu;  

  };  

  static public JMenuBar  

  createMenuBar(Object'' menuBarData) {  

    JMenuBar menuBar = new JMenuBar();  

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

      menuBar。add(  

        createMenu((Object'''')menuBarData'i'));  

    return menuBar;  

  }  

  static ButtonGroup bgroup;  

  static public JMenu   

  createMenu(Object'''' menuData) {  

    JMenu menu = new JMenu();  

    menu。setText((String)menuData'0''0');  

    menu。setMnemonic(  

      ((Character)menuData'0''1')。charValue());  

    // Create redundantly; in case there are  

    // any radio buttons:  

    bgroup = new ButtonGroup();  

    for(int i = 1; i 《 menuData。length; i++) {  

      if(menuData'i''0' == null)  

        menu。add(new JSeparator());  

      else  

        menu。add(createMenuItem(menuData'i'));  

    }  

    return menu;  

  }  

  static public JMenuItem   

  createMenuItem(Object'' data) {  

    JMenuItem m = null;  

    MType type = (MType)data'1';  

    if(type == mi)  

      m = new JMenuItem();  

    else if(type == cb)  

      m = new JCheckBoxMenuItem();  

    else if(type == rb) {  

      m = new JRadioButtonMenuItem();  

      bgroup。add(m);  

    }  

    m。setText((String)data'0');  



                                                                                        476 


…………………………………………………………Page 478……………………………………………………………

    m。setMnemonic(  

      ((Character)data'2')。charValue());  

    m。addActionListener(  

      (ActionListener)data'3');  

    m。setEnabled(  

      ((Boolean)data'4')。booleanValue());  

    if(data。length == 6)  

      m。setIcon((Icon)data'5');  

    return m;  

  }  

  Menus() {  

    setLayout(new BorderLayout());  

    add(createMenuBar(menuBar);   

      BorderLayout。NORTH);  

    JPanel p = new JPanel();  

    p。setLayout(new BorderLayout());  

    p。add(t; BorderLayout。NORTH);  

    p。add(l; BorderLayout。CENTER);  

    add(p; BorderLayout。CENTER);  

  }  

  public static void main(String args'') {  

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

  }  

} ///:~  

  

这个程序的目的是允许程序设计者简单地创建表格来描述每个菜单,而不是输入代码行来建立菜单。每个菜 

单都产生一个菜单,表格中的第一列包含菜单名和键盘快捷键。其余的列包含每个菜单项的数据:字符串存 

在在菜单项中的位置,菜单的类型,它的快捷键,当菜单项被选中时被激活的动作接收器及菜单是否被激活 

等信息。如果列开始处是空的,它将被作为一个分隔符来处理。  

为了预防浪费和冗长的多个Boolean 创建的对象和类型标志,以下的这些在类开始时就作为 static final 被 

创建:bT 和 bF 描述Booleans 和哑类 MType 的不同对象描述标准的菜单项(mi ),复选框菜单项(cb),和 

单选钮菜单项(rb)。请记住一组Object 可以拥有单一的Object 句柄,并且不再是原来的值。  

这个程序例子同样展示了JLables 和JMenuItems (和它们的衍生事物)如何处理图标的。一个图标经由它的 

构建器置放进JLable 中并当对应的菜单项被选中时被改变。  

菜单条数组控制处理所有在文件菜单清单中列出的,我们想显示在菜单条上的文件菜单。我们通过这个数组 

去使用 createMenuBar(),将数组分类成单独的菜单数据数组,再通过每个单独的数组去创建菜单。这种方 

法依次使用菜单数据的每一行并以该数据创建 JMenu,然后为菜单数据中剩下的每一行调用 createMenuItem() 

方法。最后,createMenuItem()方法分析菜单数据的每一行并且判断菜单类型和它的属性,再适当地创建菜 

单项。终于,像我们在菜单构建器中看到的一样,从表示 createMenuBar(menuBar)的表格中创建菜单,而所 

有的事物都是采用递归方法处理的。  

这个程序不能建立串联的菜单,但我们拥有足够的知识,如果我们需要的话,随时都能增加多级菜单进去。  



13。19。10 弹出式菜单  



JPopupMenu 的执行看起来有一些别扭:我们必须调用 enableEvents()方法并选择鼠标事件代替利用事件接收 

器。它可能增加一个鼠标接收器但 MouseEvent 从 isPopupTrigger()处不会返回真值——它不知道将激活一 

个弹出菜单。另外,当我们尝试接收器方法时,它的行为令人不可思议,这或许是鼠标单击活动引起的。在 

下面的程序例子里一些事件产生了这种弹出行为:  

  

//: Popup。java  

// Creating popup menus with Swing  

package c13。swing;  

import java。awt。*;  



                                                                                       477 


…………………………………………………………Page 479……………………………………………………………

import java。awt。event。*;  

import javax。swing。*;  

  

public class Popup extends JPanel {  

  JPopupMenu popup = new JPopupMenu();  

  JTextField t = new JTextField(10);  

  public Popup() {  

    add(t);  

    ActionListener al = new ActionListener () {  

      public void actionPerformed(ActionEvent e){  

        t。setText(  

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

      }  

    };  

    JMenuItem m = new JMenuItem(〃Hither〃);  

    m。addActionListener(al);  

    popup。add(m);  

    m = new JMenuItem(〃Yon〃) ;  

    m。addActionListener(al);  

    popup。add(m);  

    m = new JMenuItem(〃Afar〃);  

    m。addActionListener(al);  

    popup。add(m);  

    popup。addSeparator();  

    m = new JMenuItem(〃Stay Here〃);  

    m。addActionListener(al);  

    popup。add(m);  

    PopupListener pl = new PopupListener();  

    addMouseListener(pl);  

    t。addMouseListener(pl);  

  }  

  class PopupListener extends MouseAdapter {  

    public void mousePressed(MouseEvent e) {  

      maybeShowPopup(e);  

    }  

    public void mouseReleased(MouseEvent e) {  

      maybeShowPopup(e);  

    }  

    private void maybeShowPopup(MouseEvent e) {  

      if(e。isPopupTrigger()) {  

        popup。show(  

          e。getponent(); e。getX(); e。getY());  

      }  

    }  

  }  

  public static void main(String args'') {  

    Show。inFrame(new Popup();200;150);  

  }  

} ///:~  

  

相同的ActionListener 被加入每个 JMenuItem 中,使其能从菜单标签中取出文字,并将文字插入 

JTextField。  



                                                                                          478 


…………………………………………………………Page 480……………………………………………………………

13。19。11 列表框和组合框  



列表框和组合框在 Swing 中工作就像它们在老的AWT 中工作一样,但如果我们需要它,它们同样被增加功 

能。另外,它也更加的方便易用。例如,JList 中有一个显示String 数组的构建器(奇怪的是同样的功能在 

JboBox 中无效!)。下面的例子显示了它们基本的用法。  

  

//: Listbo。java  

// List boxes & bo boxes  

package c13。swing;  

import java。awt。*;  

import java。awt。event。*;  

import javax。swing。*;  

  

public class Listbo extends JPanel {  

  public Listbo() {  

    setLayout(new GridLayout(2;1));  

    JList list = new JList(ButtonGroups。ids);  

    add(new JScrollPane(list));  

    JboBox bo = new JboBox();  

    for(int i = 0; i 《 100; i++)  

      bo。addItem(Integer。toString(i));  

    add(bo);  

  }  

  public static void main(String args'') {  

    Show。inFrame(new Listbo();200;200);  

  }  

} ///:~  

  

最开始的时候,似乎有点儿古怪的一种情况是 JLists 居然不能自动提供滚动特性——即使那也许正是我们一 

直所期望的。增加对滚动的支持变得十分容易,就像上面示范的一样——简单地将JList 封装到 

JScrollPane 即可,所有的细节都自动地为我们照料到了。  



13。19。12 滑杆和进度指示条  



滑杆用户能用一个滑块的来回移动来输入数据,在很多情况下显得很直观(如声音控制)。进程条从“空” 

到“满”显示相关数据的状态,因此用户得到了一个状态的透视。我最喜爱的有关这的程序例子简单地将滑 

动块同进程条挂接起来,所以当我们移动滑动块时,进程条也相应的改变:  

  

//: Progress。java  

// Using progress bars and sliders  

package c13。swing;  

import java。awt。*;  

import java。awt。event。*;  

import javax。swing。*;  

import javax。swing。event。*;  

import javax。swing。border。*;  

  

public class Progress extends JPanel {  

  JProgressBar pb = new JProgressBar();  

  JSlider sb =   

    new JSlider(JSlider。HORIZONTAL; 0; 100; 60);  

  public Progress() {  

    setLayout(new GridLayout(2;1));  



                                                                                          479 


…………………………………………………………Page 481……………………………………………………………

    add(pb);  

    sb。setValue(0);  

    sb。setPaintTicks(true);  

    sb。setMajorTickSpacing(20);  

    sb。setMinorTickSpacing(5);  

    sb。setBorder(new TitledBorder(〃Slide Me〃));  

    pb。setModel(sb。getModel()); // Share model  

    add(sb);  

  }  

  public static void main(String args'') {  

    Show。inFrame(new Progress();200;150);  

  }  

} ///:~  

  

JProgressBar 十分简单,但 JSlider 却有许多选项,例如方法、大或小的记号标签。注意增加一个带标题的 

边框是多么的容易。  



13。19。13 树  



使用一个JTree 可以简单地像下面这样表示:  

add(new JTree(  

new Object'' {〃this〃; 〃that〃; 〃other〃}));  

这个程序显示了一个原始的树状物。树状物的 API 是非常巨大的,可是——当然是在Swing 中的巨大。它表 

明我们可以做有关树状物的任何事,但更复杂的任务可能需要不少的研究和试验。幸运的是,在库中提供了 

一个妥协:“默认的”树状物组件,通常那是我们所需要的。因此大多数的时间我们可以利用这些组件,并 

且只在特殊的情况下我们需要更深入的研究和理解。  

下面的例子使用了“默认”的树状物组件在一个程序片中显示一个树状物。当我们按下按钮时,一个新的子 

树就被增加到当前选中的结点下(如果没有结点被选中,就用根结节):  

  

//: Trees。java  

// Simple Swing tree example。 Trees can be made  

// vastly more plex than this。  

package c13。swing;  

import java。awt。*;  

import java。awt。event。*;  

import javax。swing。*;  

import javax。swing。tree。*;  

  

// Takes an array of Strings and makes the first  

// element a node and the rest leaves:  

class Branch {  

  DefaultMutableTreeNode r;  

  public Branch(String'' data) {  

    r = new DefaultMutableTreeNode(data'0');  

    for(int i = 1; i 《 data。length; i++)  

      r。add(new DefaultMutableTreeNode(data'i'));  

  }  

  public DefaultMutableTreeNode node() {   

    return r;   

  }  

}    

  

public class Trees extends JPanel {  



                                                                                           480 


…………………………………………………………Page 482……………………………………………………………

  String'''' data = {  

    { 〃Colors〃; 〃Red〃; 〃Blue〃; 〃Green〃 };  

    { 〃Flavors〃; 〃Tart〃; 〃Sweet〃; 〃Bland〃 };  

    { 〃Length〃; 〃Short〃; 〃Medium〃; 〃Long〃 };  

    { 〃Volume〃; 〃High〃; 〃Medium〃; 〃Low〃 };  

    { 〃Temperature〃; 〃High〃; 〃Medium〃; 〃Low〃 };  

    { 〃Intensity〃; 〃High〃; 〃Medium〃; 〃Low〃 };  

  };  

  static int i = 0;  

  DefaultMutableTreeNode root; child; chosen;  

  JTree tree;  

  DefaultTreeModel model;  

  public Trees() {  

    setLayout(new BorderLayout());  

    root = new DefaultMutableTreeNode(〃root〃);  

    tree = new JTree(root);  

    // Add it and make it take care of scrolling:  

    add(new JScrollPane(tree);   

      BorderLayout。CENTER);  

    // Capture the tree's model:  

    model =(DefaultTreeModel)tree。getModel();  

    JButton test = new JButton(〃Press me〃);  

    test。addActionListener(new ActionListener() {  

      public void actionPerformed(ActionEvent e){  

        if(i 《 data。length) {  

          child = new Branch(data'i++')。node();  

          // What's the last one you clicked?  

          chosen = (DefaultMutableTreeNode)  

            tree。getLastSelectedPathponent();  

          if(chosen == null) chosen = root;  

          // The model will create the   

          // appropriate event。 In response; the  

          // tree will update itself:  

          model。insertNodeInto(child; chosen; 0);  

          // This puts the new node on the   

          // currently chosen node。  

        }  

      }  

    });  

    // Change the button's colors:  

    test。setBackground(Color。blue);  

    test。setForeground(Color。white);  

    JPanel p = new JPanel();  

    p。add(test);  

    add(p; BorderLayout。SOUTH);  

  }  

  public static void main(String args'') {  

    Show。inFrame(new Trees();200;500);  

  }  

} ///:~  

  

最重要的类就是分支,它是一个工具,用来获取一个字符串数组并为第一个字符串建立一个 



                                                                                          481 


…………………………………………………………Page 483……………………………………………………………

DefaultMutableTreeNode 作为根,其余在数组中的字符串作为叶。然后 node()方法被调用以产生“分支”的 

根。树状物类包括一个来自被制造的分支的二维字符串数组,以及用来统计数组的一个静态中断 i。 

DefaultMutableTreeNode 对象控制这个结节,但在屏幕上表示的是被JTree 和它的相关 

 (DefaultTreeModel)模式所控制。注意当JTree 被增加到程序片时,它被封装到JScrollPane 中——这就 

是它全部提供的自动滚动。  

JTree 通过它自己的模型来控制。当我们修改这个模型时,模型产生一个事件,导致JTree 对可以看见的树 

状物完成任何必要的升级。在 init()中,模型由调用getModel()方法所捕捉。当按钮被按下时,一个新的分 

支被创建了。然后,当前选择的组件被找到(如果没有选择就是根)并且模型的 insertNodeInto()方法做所 

有的改变树状物和导致它升级的工作。  

大多数的时候,就像上面的例子一样,程序将给我们在树状物中所需要的一切。不过,树状物拥有力量去做 

我们能够想像到的任何事——在上面的例子中我们到处都可看到“default (默认)”字样,我们可以取代我 

们自己的类来获取不同的动作。但请注意:几乎所有这些类都有一个具大的接口,因此我们可以花一些时间 

努力去理解这些错综复杂的树状物。  



13。19。14 表格  



和树状物一样,表格在 Swing 相当的庞大和强大。它们最初有意被设计成以 Java 数据库连结(JDBC,在1
返回目录 上一页 下一页 回到顶部 10 9
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!