toggle按钮,Togglebutton

  toggle按钮,Togglebutton

  现在我们已经知道了相对简单的Swing组件JLabel和JButton的功能,下面我们来学习一些更主动的组件,尤其是那些可以切换的组件。这些被称为可切换组件的组件——JToggleButton、JCheckBox和JRadioButton——为我们的用户提供了从一组选项中进行选择的方法。这些选项可以是打开、关闭、允许或禁止。当它在ButtonGroup中时,一次只能选择该组中的一个选项。为了处理选定的状态,组件与ToogleButtonModel共享一个公共数据模型。让我们看一下数据模型、使用ButtonGroup的组件组合机制和单个组件。

  5.1 ToggleButtonModel类

  JToggleButton。ToggleButtonMode类是JToggleButton的公共内联类。该类自定义DefaultButtonModel类的行为,并实现ButtonModel接口。

  自定义行为影响ButtonGroup组件中所有AbstractButto的数据模型,ButtonGroup将在后面讨论。简单地说,ButtonGroup是AbstractButton组件的逻辑组合。在任何时候,ButtonGroup中只有一个AbstractButton组件的selected属性设置为true,其他的必须为false。这并不意味着在组合中任何时候都只有一个选定的组件。如果ButtonGroup中的多个组件共享一个ButtonModel,则组合中可以有多个选定的组件。如果没有组件共享模型,用户最多可以在组合中选择一个组件。一旦用户选择了组件,用户就不能交互式地取消选择。但是,通过编程,我们可以取消选中所有组合元素。

  JTOGGLEButton。切换按钮模型定义如下:

  公共类ToggleButtonModel扩展了DefaultButtonModel {

  //构造函数

  公共ToggleButtonModel();

  //属性

  public布尔值is selected();

  public void setPressed(布尔new value);

  public void setSelected(布尔型new value);

  }

  ToggleButtonModel类定义了JToogleButton及其子类JCheckBox和JRadioButton的默认数据模型,这些将在后面的章节中介绍,JCheckBoxMenuItem和JRadioButtonMenuItem类将在第6章中介绍。

  5.2按钮组类

  在描述ButtonGroup类之前,让我们演示一下它的用法。清单5-1中的程序使用ToggleButtonModel创建对象,并将它们组合在一起。正如程序演示的那样,除了将组件添加到屏幕容器中,我们还必须将每个组件添加到同一个ButtonGroup中。这导致每个组件都有一对add()方法调用。此外,按钮组合的容器会将组件放在一个列中,并使用带有标题的边框来为用户标识组合,尽管这些不是必需的。图5-1显示了程序的输出。

  包swingstudy.ch04

  导入Java . awt . borderlayout;

  导入Java . awt . event queue;

  导入Java . awt . gridlayout;

  导入javax . swing . abstract button;

  导入javax . swing . border factory;

  导入javax . swing . button group;

  导入javax . swing . jcheckbox;

  导入javax . swing . jcheckboxmenuitem;

  导入javax . swing . jframe;

  导入javax . swing . jpanel;

  导入javax . swing . jradiobutton;

  导入javax . swing . jradiobuttonmenuitem;

  导入javax . swing . jtogglebutton;

  导入javax . swing . border . border;

  公共类邻接组{

  * @param args

  公共静态void main(String[] args) {

  //TODO自动生成的方法存根

  Runnable runner=new Runnable() {

  公共无效运行(){

  JFrame frame=new JFrame(按钮组);

  frame . setdefaultcloseoperation(JFrame。EXIT _ ON _ CLOSE);

  JPanel panel=new JPanel(new GridLayout(0,1));

  border border=border factory . createtitledborder( Examples );

  panel . set border(border);

  button group group=new button group();

  abstract Button abstract 1=new JToggleButton( Toggle Button );

  panel . add(abstract 1);

  group . add(abstract 1);

  abstract Button abstract 2=new JRadioButton(“单选按钮”);

  panel . add(abstract 2);

  group . add(abstract 2);

  abstract button abstract 3=new JCheckBox(复选框);

  panel . add(abstract 3);

  group . add(abstract 3);

  abstract Button abstract 4=new JRadioButtonMenuItem("单选按钮菜单项");

  面板。补充(摘要4);

  团体。补充(摘要4);

  抽象按钮abstract 5=new JCheckBoxMenuItem("复选框菜单项");

  面板。补充(摘要5);

  团体。补充(摘要5);

  frame.add(panel,BorderLayout .中心);

  frame.setSize(300,200);

  框架。设置可见(真);

  事件队列。稍后调用(runner);

  }

  正如前面所说的,按钮组类表示抽象按钮组件的逻辑组合按钮组并不是一个可视化组件;所以,当使用按钮组时在屏幕上并没有任何可见的内容。任何的抽象按钮组件可以通过公共void add(抽象按钮抽象按钮)方法添加到组合中。尽管任意的抽象按钮组件都可以属于一个按钮组,只有当组件的数据模型是ToggleButtonModel时组合才会起作用。在按钮组中具有一个模型为ToggleButtonModel的组件的结果是在组件被选中之后,按钮组会出取消选中组合中当前被选中的组件。

  尽管添加()方法通常是我们唯一需要的方法,下面的类定义显示了其并不是按钮组中唯一的方法:

  公共类按钮组实现可序列化{

  //构造函数

  公共按钮组();

  //属性

  public int getButtonCount();

  公共枚举获取元素();

  公共按钮模型get selection();

  //其他方法

  public void add(抽象按钮按钮);

  选择了公共布尔(按钮型号模型);

  public void remove(抽象按钮按钮按钮);

  选择了公共空集(按钮模型模型,布尔新值);

  }

  如上的类定义所显示的一件有趣的事就是给定一个按钮组,我们并不能直接确定被选中的抽象按钮。我们只可以直接查询哪一个按钮模型被选中。然而,getElements()可以返回组合中所有抽象按钮元素的枚举。然后我们可以使用类似如下的代码在所有的按钮中进行遍历来确定被选中的按钮:

  枚举元素=组。获取元素();

  而(元素。hasmorelements()){

  抽象按钮button=(抽象按钮)元素。next element();

  if (button.isSelected()) {

  System.out.println(胜出者为:按钮。gettext());

  打破;//共享模型时不要中断-可以显示多个选中的按钮

  }

  按钮组另一个有趣的方法就是setSelected()。这个方法的两个参数是按钮模型与布尔型。如果布尔型的值为假的,则选中的请求会被忽略。如果按钮模型并不是按钮组中的按钮的模型,那么按钮组会取消选中当前被选中的模型,从而使得组合中没有按钮被选中。这个方法的正确使用是使用组合中组件的模型以及一个真实的的新状态进行方法调用。例如,如果阿布顿是一个抽象按钮而一组是按钮组,那么方法的调用类似于a组。设置选择(大约吨。get model(),true)。

  下面我们来了解一下数据模型为ToggleButtonModel的各种组件。

toggle按钮,Togglebutton