本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.youkuaiyun.com/jesson20121020
了解了布局管理器和Swing事件模型,那么剩下的就是Swing 的各个组件了,下面就开始逐个学习Swing的各个组件的用法及功能,本节先来看最常用的按钮和按钮组。
1. 按钮
Swing提供了许多类型的按钮,有普通的按钮,复选框,单选等按钮,甚至菜单项,所有的这些按钮都是从AbstractButton继承而来。如下图的继承关系:
可以看出,JButton,JMenuItem,JToggleButton都是AbstractButton的子类,我们再继续往下看它们的子类:
这里就列出了所有的按钮,下面就演示各个按钮的用法,这里不再实现监听器,可以根据需要自己添加。
public class Buttons extends JFrame {
private JButton jb = new JButton("按钮");
private BasicArrowButton
up = new BasicArrowButton(BasicArrowButton.NORTH),
down = new BasicArrowButton(BasicArrowButton.SOUTH),
right = new BasicArrowButton(BasicArrowButton.EAST),
center = new BasicArrowButton(BasicArrowButton.CENTER),
left = new BasicArrowButton(BasicArrowButton.WEST);
public Buttons() {
// TODO Auto-generated constructor stub
setVisible(true);
setSize(500,300);
setLayout(new FlowLayout());
add(jb);
add(new JToggleButton("JToggleButton"));
add(new JCheckBox("JCheckBox"));
add(new JRadioButton("JRadioButton"));
JPanel jp = new JPanel();
jp.setBorder(new TitledBorder("BasicArrowButton"));
jp.add(up);
jp.add(down);
jp.add(left);
jp.add(right);
jp.add(center);
add(jp);
JPanel jp1 = new JPanel();
jp1.setBorder(new TitledBorder("JCheckBoxMenuItem"));
jp1.add(new JCheckBoxMenuItem("JCheckBoxMenuItem1"));
jp1.add(new JCheckBoxMenuItem("JCheckBoxMenuItem2"));
add(jp1);
JPanel jp2 = new JPanel();
jp2.setBorder(new TitledBorder("JRadioButtonMenuItem"));
jp2.add(new JRadioButtonMenuItem("JRadioButtonMenuItem1"));
jp2.add(new JRadioButtonMenuItem("JRadioButtonMenuItem2"));
add(jp2);
JPanel jp3 = new JPanel();
jp3.setBorder(new TitledBorder("JMenu"));
jp3.add(new JMenu("JMenu1"));
jp3.add(new JMenu("JMenu2"));
add(jp3);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Buttons();
}
}
运行,如下图效果:
这里仅仅是将这些按钮显示在窗体上,并没有给各个组件添加事件监听器。
2.按钮组
要想让单选按钮表现出某种"排他"行为,必须把它们加入到一个"按钮组(ButtonGroup)"中,其实,任何AbstarctButton对象都可以加入到按钮组中。
为了避免重复的代码,下面的例子使用反射功能来产生几组不同的类型的按钮。
public class ButtonGroups extends JFrame {
private static String[] ids = {
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
"Sun"
};
private JPanel makePanel(Class<? extends AbstractButton> kind,String[] ids){
ButtonGroup bg = new ButtonGroup();
JPanel jp = new JPanel();
String title = kind.getName();
title = title.substring(title.lastIndexOf('.')+1);
jp.setBorder(new TitledBorder(title));
for(String id : ids){
AbstractButton ab = new JButton("failed");
try {
Constructor ctor = kind.getConstructor(String.class);
ab = (AbstractButton)ctor.newInstance(id);
} catch (Exception e) {
System.out.println("cat't create "+kind);
}
bg.add(ab);
jp.add(ab);
}
return jp;
}
public ButtonGroups() {
// TODO Auto-generated constructor stub
setLayout(new FlowLayout());
setSize(500,300);
setVisible(true);
add(makePanel(JButton.class, ids));
add(makePanel(JToggleButton.class,ids));
add(makePanel(JCheckBox.class,ids));
add(makePanel(JRadioButton.class,ids));
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ButtonGroups();
}
}
其中,makePanel()方法,是用来创建一个按钮组和一个JPanel,此方法的第二个参数是一个字符串数据,针对其中每个字符串,将创建一个由第一个参数所代表的按钮实例,然后将此按钮加入到JPanel中。
运行程序,效果如下:
边框的标题是从类的名称中得到的,并且去掉了其中的前缀,直接取出类名。getConstructor()方法产生一个Constructor对象,这个构造器接受“传递给getConstructor()”的Class列表里面指定的类型“所组成的数组作为码数,然后,只需要调用newInstance(),并且把包含实际参数列表传递给它,在本实例中即ids数据的字符串。
要想通过按钮得到“排他”行为,就得先创建一个按钮组,然后把你希望具有的“排他”行为的按钮加入到这个按钮组中。运行程序,可以发现除了JButton以外,其他按钮都具有这种“排他”的行为。