5.3 JToggleButton类

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

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

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

5.3.1 创建JToggleButton组件

对于JToggleButton有八个构造函数:

public JToggleButton()
JToggleButton aToggleButton = new JToggleButton();   
public JToggleButton(Icon icon)
JToggleButton aToggleButton = new JToggleButton(new DiamondIcon(Color.PINK))   
public JToggleButton(Icon icon, boolean selected)
JToggleButton aToggleButton = new JToggleButton(new DiamondIcon(Color.PINK), true);   
public JToggleButton(String text)
JToggleButton aToggleButton = new JToggleButton("Sicilian");   
public JToggleButton(String text, boolean selected)
JToggleButton aToggleButton = new JToggleButton("Thin Crust", true);   
public JToggleButton(String text, Icon icon)
JToggleButton aToggleButton = new JToggleButton("Thick Crust",new DiamondIcon(Color.PINK));   public JToggleButton(String text, Icon icon, boolean selected)
JToggleButton aToggleButton = new JToggleButton("Stuffed Crust",new DiamondIcon(Color.PINK), true);   public JToggleButton(Action action)
Action action = ...;
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示例源码所示:

ActionListener actionListener = new ActionListener() {public void actionPerformed(ActionEvent actionEvent) {AbstractButton abstractButton = (AbstractButton)actionEvent.getSource();boolean selected = abstractButton.getModel().isSelected();System.out.println("Action - selected=" + selected + "/ n");}
};

使用ItemListener监听JToggleButton事件

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

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

ItemListener itemListener = new ItemListener() {public void itemStateChanged(ItemEvent itemEvent) {int state = itemEvent.getStateChange();if (state == ItemEvent.SELECTED) {System.out.println("Selected");}  else {System.out.println("Deselected");}}
};

使用ChangeListener监听JToggleButton事件

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

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

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

ChangeListener changeListener = new ChangeListener() {public void stateChanged(ChangeEvent changeEvent) {AbstractButton abstractButton = (AbstractButton)changeEvent.getSource();ButtonModel buttonModel = abstractButton.getModel();boolean armed = buttonModel.isArmed();boolean pressed = buttonModel.isPressed();boolean selected = buttonModel.isSelected();System.out.println("Changed: " + armed + "/" + pressed + "/" + selected);}
};

在我们将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行之间。

package swingstudy.ch04;   import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;   import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.JFrame;
import javax.swing.JToggleButton;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;   public class SelectingToggle {   /*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub   Runnable runner = new Runnable() {public void run() {JFrame frame = new JFrame("Selecting Toggle");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   JToggleButton toggleButton = new JToggleButton("Toggle Button");   ActionListener actionListener = new ActionListener() {public void actionPerformed(ActionEvent event) {AbstractButton abstractButton = (AbstractButton)event.getSource();boolean selected = abstractButton.getModel().isSelected();System.out.println("Action - selected="+selected+"/n");}};   ChangeListener changeListener = new ChangeListener() {public void stateChanged(ChangeEvent event) {AbstractButton abstractButton = (AbstractButton)event.getSource();ButtonModel buttonModel = abstractButton.getModel();boolean armed = buttonModel.isArmed();boolean pressed = buttonModel.isPressed();boolean selected = buttonModel.isSelected();System.out.println("Changed: "+armed +"/"+pressed+"/"+selected);}};   ItemListener itemListener = new ItemListener() {public void itemStateChanged(ItemEvent event) {int state = event.getStateChange();if(state == ItemEvent.SELECTED) {System.out.println("Selected");}else {System.out.println("Deselected");}}};   toggleButton.addActionListener(actionListener);toggleButton.addChangeListener(changeListener);toggleButton.addItemListener(itemListener);   frame.add(toggleButton, BorderLayout.NORTH);frame.setSize(300, 125);frame.setVisible(true);}};EventQueue.invokeLater(runner);}   }

5.3.4 自定义JToggleButton观感

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

表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

Toggle Buttons(二)相关推荐

  1. Toggle Buttons(一)

    现在我们已经了解了相对简单的Swing组件JLabel与JButton的功能,现在我们来了解一些更为活跃的组件,特别是这些可以切换的组件.这些称之为可切换的组件-JToggleButton,JChec ...

  2. 风格化的 Toggle Buttons

    目标: Android到默认UI比iOS到默认UI在美观程度上还是有一定到差距的,我们希望能够美化UI,并且替换掉系统默认的UI风格,使得程序在使用这些UI的时候都默认使用我们自定义到UI.本文以To ...

  3. Toggle Buttons(四)

    5.5 JRadionButton类 当我们希望创建一个相斥的可切换组件组时我们可以使用JRadioButton.尽管由技术上来说,我们可以将一组JCheckBox组件放在一个ButtonGroup中 ...

  4. Revit启动后,如何把你的命令显示在Revit的Ribbon(工具栏)上?

    在开发的过程中,大家经常用AddinManager来运行你的外部命令,这样的好处是程序的修改,运行,调试速度可以很快. 我就此也写过一篇文章. 当你开发结束后,希望你的客户直接在Revit启动后就可以 ...

  5. Excel+VBA帮助

    目录 一.VBA 入门知识 1.激活工作簿 2.创建新工作簿 3.打开工作簿 4.用编号引用工作表 5.用名称引用工作表 6.将文档保存为 Web 页 7.用 A1 样式的记号引用单元格和单元格区域 ...

  6. 28个免费漂亮的切换开关UI PSD下载

    用户界面元素是现在的热门焦点,我们很多设计师的工作已经和它息息相关.那么,如何提高UI设计水平呢?这也是一个永恒的话题,值得探索.值得钻研.而今天要和您聊聊的是在用户界面组件中,存在与网站和移动应用程 ...

  7. jquery-12 折叠面板如何实现(两种方法)

    jquery-12 折叠面板如何实现(两种方法) 一.总结 一句话总结:1.根据点击次数来判断显示还是隐藏,用data方法保证每个元素一个点击次数:2.找到元素的下一个,然后toggle实现显示隐藏. ...

  8. jquery API

    jQuery API Documentation详细的API和例子说明,请参考文档:http://docs.jquery.com/Main_Page百度百科的解析:http://baike.baidu ...

  9. pyqt5教程9:Widgets组件

    PyQt5 widgets 小部件是应用程序的基本构建块. PyQt5 有各种各样的小部件,包括按钮.复选框.滑块或列表框.在本教程的这一部分,我们将描述几个有用的小部件:QCheckBox.切换模式 ...

最新文章

  1. 牛津大佬|计算机科学方向一对一科研项目
  2. 转: Source Code Lookup in Eclipse(主要讲的是java的)
  3. 德意志银行CEO:将逐渐用 AI 替代人工,银行决不会一成不变 凤凰科技 09-08 20:41 原标题:德意志银行CEO:将逐渐用 AI 替代人工,银行决不会一成不变 雷锋网AI金融评论报道,外媒i
  4. Activiti入门文档
  5. ipsec NAT-T与穿透
  6. 高级数据分析1代码_用Python进行数据分析,让你一看就会
  7. 计算机网络实验:VLAN Practice Lab Setup in Packet Tracer and Configure DHCP Server for multiple VLAN
  8. 【Kafka】Kafka inter.broker.listener.name must be a listener name defined in advertised.listeners
  9. 基于JSP实现的影视创作论坛系统
  10. 自制CMSIS-DAP下载器
  11. 睿智的目标检测7——yolo3详解及其预测代码复现
  12. YouTube改进之transformer
  13. 很抱歉,三维地图当前不能在你的国家/地区使用 Excel绘制三维地图问题解决
  14. OpenCV 局部自适应对比度增强ACE算法
  15. 游戏介绍——《逆转裁判》
  16. android ip v6 teredo,Win7系统通过teredo连接IPv6的方法
  17. 计算机图形学之绘制旗子
  18. 云创青少年人工智能学院城市合伙人大会圆满收官!
  19. bzoj 3838: [Pa2013]Raper (线段树)
  20. 常见linux服务器存储空间,怎么在linux上查看服务器的存储空间多大

热门文章

  1. 共享GPU来了!投身去中心化机器学习,比挖矿多赚3倍
  2. AlphaZero完胜三大世界冠军棋类程序:5000个TPU、自学一天
  3. 哈佛MIT联手出品 | 造价低于1美元的机械臂,可承自身重量千倍
  4. 对话陆奇:用产品思维变革百度工程师文化,欣赏腾讯内部赛马机制
  5. React-Native入门(2)-简单阐述跳转
  6. 部署Docker前必须问自己的四个问题
  7. PCL中分割方法的介绍(2)
  8. MySql的事务操作与演示样例
  9. 关于C#传给视图的字符串带有Html转义字符的处理
  10. 为什么 scrum 开发人员是一个 T-形的人 ?