使用JCheckBox组件:
类层次结构图:
java.lang.Object --java.awt.Component --java.awt.Container --javax.swing.JComponent --javax.swing.AbstractButton --javax.swing.JToggleButton --javax.swing.JCheckBox
JCheckBox与JRadioButton为JToggleButton的子类,因此它们可以使用AbstractButton抽象类里面许多好用的方法,如addItemLi stener()、setText()、isSelected()等等。
构造函数:
- JCheckBox():建立一个新的JChcekBox.
- JCheckBox(Icon icon):建立一个有图像但没有文字的JCheckBox.
- JCheckBox(Icon icon,boolean selected):建立一个有图像但没有文字的JCheckBox,且设置其初始状态(有无被选取)。
- JCheckBox(String text):建立一个有文字的JCheckBox.
- JCheckBox(String text,boolean selected):建立一个有文字的JCheckBox,且设置其初始状态(有无被选取)。
- JCheckBox(String text,Icon icon):建立一个有文字且有图像的JCheckBox,初始状态为无被选取。
- JCheckBox(String text,Icon icon,boolean selected):建立一个有文字且有图像的JCheckBox,且设置其初始状态(有无被选取 )。
7-1-1:构造JCheckBox组件:
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JCheckBox1 { public static void main(String[] args) { JFrame f = new JFrame("JCheckBox1"); Container contentPane = f.getContentPane(); contentPane.setLayout(new GridLayout(2, 1)); JPanel p1 = new JPanel(); p1.setLayout(new GridLayout(1, 3)); p1.setBorder(BorderFactory.createTitledBorder("你最喜欢哪一家快餐店呢?")); JCheckBox c1 = new JCheckBox("麦当劳"); JCheckBox c2 = new JCheckBox("肯德基"); JCheckBox c3 = new JCheckBox("21世纪"); p1.add(c1); p1.add(c2); p1.add(c3); JPanel p2 = new JPanel(); p2.setLayout(new GridLayout(2, 1)); p2.setBorder(BorderFactory.createTitledBorder("以下为JCheckBox的图形示范:")); JCheckBox c4 = new JCheckBox("图形1", new ImageIcon(".\\icons\\x.jpg")); JCheckBox c5 = new JCheckBox("图形2", new ImageIcon(".\\icons\\x.jpg")); p2.add(c4); p2.add(c5); contentPane.add(p1); contentPane.add(p2); f.pack(); f.show(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } }
7-1-2:JCheckBox事件处理:
你可以在上面的选项中勾选你喜欢吃的快餐店,在勾选的过程中,你可以发现它是可以复选的。但在图形选项中,我们并无法 清楚用户是否选择此项目,因为选或不选图形都一样。为解决这个问题,我们要使用到事件处理方法。当JCheckBox中的选项被选取 或取消时,它会触发ItemEvent的事件,ItemEvent这个类共提供了4种方法可以使用,分别是getItem()、getItemSelectable()、 getStateChange()、paramString()。getItem()与paramString()方法会返回一些这个JCheckBox的状态值。一般我们较少用到这两 个方法。
getItemSelectable()相当于getSource()方法,一样都是返回触发事件的组件,用来判断是那个组件产生事件。在上一章中我 们曾经说过,getSource()方法是EventObject类所提供,而所有事件类都会继承这个类,因此所有的事件我们均能用getSource() 方法来判断到底是哪个组件触发了事件。
最后getStateChange()方法会返回此组件到底有没有被选取。这个方法会返回一个整数值。而我们可以用ItemEvent所提供的类 变量;若被选取则返回SELECTED,若没有被选取则返回DESELECTED.
下面这个范例我们即利用ItemListener来选取图形产生变化,ItemListener这个inteface只有定义一个方法,那就是 itemStateChange(ItemEvent e),因此我们只需实作这个方法.
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JCheckBox2 implements ItemListener { JFrame f = null; JCheckBox c4 = null; JCheckBox c5 = null; JCheckBox2() { f = new JFrame("JCheckBox"); Container contentPane = f.getContentPane(); contentPane.setLayout(new GridLayout(2, 1)); JPanel p1 = new JPanel(); p1.setLayout(new GridLayout(1, 3)); p1.setBorder(BorderFactory.createTitledBorder("您最喜欢哪一家速食店呢?")); JCheckBox c1 = new JCheckBox("麦当劳"); JCheckBox c2 = new JCheckBox("肯德鸡"); JCheckBox c3 = new JCheckBox("21世纪"); p1.add(c1); p1.add(c2); p1.add(c3); JPanel p2 = new JPanel(); p2.setLayout(new GridLayout(2, 1)); p2.setBorder(BorderFactory.createTitledBorder("您喜欢哪种程序语言,喜欢的请打勾:")); c4 = new JCheckBox("JAVA", new ImageIcon(".\\icons\\x.jpg")); c5 = new JCheckBox("C++", new ImageIcon(".\\icons\\x.jpg")); c4.addItemListener(this); c5.addItemListener(this); p2.add(c4); p2.add(c5); contentPane.add(p1); contentPane.add(p2); f.pack(); f.show(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == e.SELECTED) { if (e.getSource() == c4) c4.setIcon(new ImageIcon(".\\icons\\r.jpg")); if (e.getSource() == c5) c5.setIcon(new ImageIcon(".\\icons\\r.jpg")); } else { if (e.getSource() == c4) c4.setIcon(new ImageIcon(".\\icons\\x.jpg")); if (e.getSource() == c5) c5.setIcon(new ImageIcon(".\\icons\\x.jpg")); } } public static void main(String args[]) { new JCheckBox2(); } }