Chinaunix首页 | 论坛 | 博客
  • 博客访问: 891406
  • 博文数量: 96
  • 博客积分: 10681
  • 博客等级: 上将
  • 技术积分: 2449
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-16 17:52
文章分类

全部博文(96)

文章存档

2011年(30)

2009年(36)

2008年(30)

分类: Java

2011-03-17 18:23:09

5.3 JToggleButton类

JToggleButton是第一个可切换的组件。首先讨论JToggleButton类是因为他是其他们非面向菜单的组件,JCheckBox与JRadioButton,的父类。JToggleButton类似于JButton,当被选中时处理按下状态,相反则会返回到未选中状态。要取消被选中的组件,我们必须重新选择该组件。JToggleButton并不是一个被广泛使用的组件,但是我们会发现在工具栏上这个组件会非常有用,例如在Microsoft Word中或是在一个文件对话奇巧事,如图5-2所示。

Swing_5_2

定义JToggleButton结构是两个自定义AbstractButton父类的对象:ToggleButonModel与ToggleButtonUI。ToggleButtonModel类表示组件的自定义的ButtonModel数据模型,而ToggleButtonUI则是用户接口委托。

下面我们已经了解了JToggleButton的不同方面,现在我们来了解一下如何使用。

5.3.1 创建JToggleButton组件

对于JToggleButton有八个构造函数:

  1. public JToggleButton()
  2. JToggleButton aToggleButton = new JToggleButton(); 

  3. public JToggleButton(Icon icon)
  4. JToggleButton aToggleButton = new JToggleButton(new DiamondIcon(Color.PINK)) 

  5. public JToggleButton(Icon icon, boolean selected)
  6. JToggleButton aToggleButton = new JToggleButton(new DiamondIcon(Color.PINK), true); 

  7. public JToggleButton(String text)
  8. JToggleButton aToggleButton = new JToggleButton("Sicilian"); 

  9. public JToggleButton(String text, boolean selected)
  10. JToggleButton aToggleButton = new JToggleButton("Thin Crust", true); 

  11. public JToggleButton(String text, Icon icon)
  12. JToggleButton aToggleButton = new JToggleButton("Thick Crust",
  13.   new DiamondIcon(Color.PINK)); public JToggleButton(String text, Icon icon, boolean selected)
  14. JToggleButton aToggleButton = new JToggleButton("Stuffed Crust",
  15.   new DiamondIcon(Color.PINK), true); public JToggleButton(Action action)
  16. Action action = ...;
  17. JToggleButton aToggleButton = new JToggleButton(action);

每一个都允许我们自定义一个或是多个标签,图标,或是初始选中状态。除非指定,标签是空的,没有文本或是图标,而按钮初始时未被选中。

5.3.2 JToggleButton属性

在创建了JToggleButton之后,我们就可以修改其属性。尽管JToggleButton有近100个继承的属性,表5-1只显示了JToggleButton所引入的两个属性。其余的属性来自于AbstractButton,JComponent,Container以及Component。

JToggleButton属性

属性名
数据类型

访问性

accessibleContext
AccessibleContext

只读

UIClassID
String

只读

我们可以在构造函数中修改一个或是多个text, icon或是selected属性,以及第4章所描述的其他的AbstractButton属性。我们可以通过getter与setter方法配置基本的三个属性:get/setText(), get/setIcon()以及is/setSelected()或setAction(action)。其他的属性也具有相应的getter与setter方法。

JToggleButton的更多的可视化配置选项包括按钮不同状态的各种图标。除了标准图标以外,当按钮被选中时,我们可以显示一个不同的图标。然而,如果我们正基于当前的选中状态修改图标,那么JToggleButton也许并不是最合适的组件。我们可以修改其子类,JCheckBox或是JRadioButton,我们会在本章稍后进行讨论。

5.3.3 处理JToggleButton选中事件

在配置了JToggleButton之后,我们可以使用三种方法来处理选中事件:使用ActionListener,ItemListener或是ChangeListener。除了向构造函数提供Action之外,被通知的方式类似于ActionListener。

使用ActionListener监听JToggleButton事件

如果我们只对当用户选中或是取消选中JToggleButton时所发生事件感兴趣,我们将ActionListener与组件相关联。在用户选中按钮之后,组件会通知任何已注册的ActionListener对象。不幸的是,这并不是所需要的行为,因为我们必须主动确定按钮的状态,从而我们能够对选中或是取消选中进行正确的响应。要确定选中状态,我们必须获取事件源的模型,然后查询其选中状态,如下面的ActionListener示例源码所示:

  1. ActionListener actionListener = new ActionListener() {
  2.   public void actionPerformed(ActionEvent actionEvent) {
  3.     AbstractButton abstractButton = (AbstractButton)actionEvent.getSource();
  4.     boolean selected = abstractButton.getModel().isSelected();
  5.     System.out.println("Action - selected=" + selected + "\ n");
  6.   }
  7. };

使用ItemListener监听JToggleButton事件

关联到JToggleButton更好的监听器是ItemListener。ItemEvent会被传递到ItemListener的itemStateChanged()方法,包括按钮当前的选中状态。这使得我们可以进行正确的响应,而不需要查询当前的按钮状态。

为了演示,下面的ItemListener报告被选中的ItemEvent生成组件的状态:

  1. ItemListener itemListener = new ItemListener() {
  2.   public void itemStateChanged(ItemEvent itemEvent) {
  3.     int state = itemEvent.getStateChange();
  4.     if (state == ItemEvent.SELECTED) {
  5.       System.out.println("Selected");
  6.     } else {
  7.       System.out.println("Deselected");
  8.     }
  9.   }
  10. };

使用ChangeListener监听JToggleButton事件

将ChangeListener关联到JToggleButton提供更多的灵活性。任意关联的监听器都会得到按钮数据模型变化的通知,响应armed, pressed以及selected属性的变化。由三个监听器监听通知-ActionListener, ItemListener以及ChangeListener-使得我们有七次不同的反应。

图5-3显示了ButtonModel属性变化序列,以及模型何时通知每个监听器。

Swing_5_3

为了演示ChangeListener通知,下面的代码片段定义了一个报告按钮模型三个属性状态变化的ChangeListener:

  1. ChangeListener changeListener = new ChangeListener() {
  2.   public void stateChanged(ChangeEvent changeEvent) {
  3.     AbstractButton abstractButton = (AbstractButton)changeEvent.getSource();
  4.     ButtonModel buttonModel = abstractButton.getModel();
  5.     boolean armed = buttonModel.isArmed();
  6.     boolean pressed = buttonModel.isPressed();
  7.     boolean selected = buttonModel.isSelected();
  8.     System.out.println("Changed: " + armed + "/" + pressed + "/" + selected);
  9.   }
  10. };

在我们将ChangeListener关联到JToggleButton之后并且通过组件之上的鼠标按下与释放选中组件时,输出结果如下:

Changed: true/false/false

Changed: true/true/false

Changed: true/true/true

Changed: true/false/true

Changed: false/false/true

将所有三个监听器关联到相同的按钮,已注册的ItemListener对象的通知将会在选中属性变化之后发生,换句说,在第3行与第4行之间。列表5-2演示了叛逆到相同的JToggleButton的所有三个监听器。考虑到已注册的ActionListener对象,通知发生在释放按钮之后,但是却在armed状态变为false之前,在第4行与第5行之间。

  1. package swingstudy.ch04;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.EventQueue;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.awt.event.ItemEvent;
  8. import java.awt.event.ItemListener;
  9.  
  10. import javax.swing.AbstractButton;
  11. import javax.swing.ButtonModel;
  12. import javax.swing.JFrame;
  13. import javax.swing.JToggleButton;
  14. import javax.swing.event.ChangeEvent;
  15. import javax.swing.event.ChangeListener;
  16.  
  17. public class SelectingToggle {
  18.  
  19.     /**
  20.      * @param args
  21.      */
  22.     public static void main(String[] args) {
  23.         // TODO Auto-generated method stub
  24.  
  25.         Runnable runner = new Runnable() {
  26.             public void run() {
  27.                 JFrame frame = new JFrame("Selecting Toggle");
  28.                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  29.  
  30.                 JToggleButton toggleButton = new JToggleButton("Toggle Button");
  31.  
  32.                 ActionListener actionListener = new ActionListener() {
  33.                     public void actionPerformed(ActionEvent event) {
  34.                         AbstractButton abstractButton = (AbstractButton)event.getSource();
  35.                         boolean selected = abstractButton.getModel().isSelected();
  36.                         System.out.println("Action - selected="+selected+"\n");
  37.                     }
  38.                 };
  39.  
  40.                 ChangeListener changeListener = new ChangeListener() {
  41.                     public void stateChanged(ChangeEvent event) {
  42.                         AbstractButton abstractButton = (AbstractButton)event.getSource();
  43.                         ButtonModel buttonModel = abstractButton.getModel();
  44.                         boolean armed = buttonModel.isArmed();
  45.                         boolean pressed = buttonModel.isPressed();
  46.                         boolean selected = buttonModel.isSelected();
  47.                         System.out.println("Changed: "+armed +"/"+pressed+"/"+selected);
  48.                     }
  49.                 };
  50.  
  51.                 ItemListener itemListener = new ItemListener() {
  52.                     public void itemStateChanged(ItemEvent event) {
  53.                         int state = event.getStateChange();
  54.                         if(state == ItemEvent.SELECTED) {
  55.                             System.out.println("Selected");
  56.                         }
  57.                         else {
  58.                             System.out.println("Deselected");
  59.                         }
  60.                     }
  61.                 };
  62.  
  63.                 toggleButton.addActionListener(actionListener);
  64.                 toggleButton.addChangeListener(changeListener);
  65.                 toggleButton.addItemListener(itemListener);
  66.  
  67.                 frame.add(toggleButton, BorderLayout.NORTH);
  68.                 frame.setSize(300, 125);
  69.                 frame.setVisible(true);
  70.             }
  71.         };
  72.         EventQueue.invokeLater(runner);
  73.     }
  74.  
  75. }
 5.3.4 自定义JToggleButton观感

每一个已安装的Swing观感都提供了不同的JToggleButton外观以及默认的UIResource值集合。图5-4显示了预安装的观感类型集合的JToggleButton的外观:Motif,Windows以及Ocean。正如按钮标签所指示的,第一个按钮被选中,第二个具有输入焦点(没有选中),第三个没有选中。

Swing_5_4

表5-2显示了JToggleButtonUIResource相关属性的集合。JToggleButton组件具有17个不同的属性。

JToggleButton UIResource元素

属性字符串

对象类型

ToggleButton.background

Color

ToggleButton.border

Border

Toggle.darkShadow

Color

ToggleButton.disabledText

Color

ToggleButton.focus

Color

ToggleButton.focusInputMap

Object[]

ToggleButton.font

Font

ToggleButton.foreground

Color

ToggleButton.gradient

List

ToggleButton.highlight

Color

ToggleButton.light

Color

ToggleButton.margin

Insets

ToggleButton.select

Color

ToggleButton.shadow

Color

ToggleButton.textIconGap

Integer

ToggleButton.textShiftOffset

Integer

ToggleButtonUI

String

阅读(943) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~