JButton的使用:
JButton的类层次结构图:
java.lang.Object
--java.awt.Component
--javax.swing.JComponent
--javax.swing.AbstractButton
--javax.swing.JButton
JButton是继承AbstractButton类而来,而AbstractButton本身是一个抽象类,里面定义了许多组件设置的方法与组件事件驱动 方法(Event handle),如addActionListener()、setText等,详情请看相关手册,所提供的方法不下50种,可说是非常重要的一个 类。事实上,AbstractButton类不公被JButton所继承,它同时还被JMenuItem、JToggleButton、JCheckBox、JRadioButton等类所 继承,提供给这些类强大且方便的功能,而且在使用上更能掌握这些组件的特性。我们此节先来了解JButton与JToggleButton的特 性,其余类在后面各节介绍。
JButton共有4个构造函数:
- JButton():建立一个按钮。
- JButton(Icon icon):建立一个有图像的按钮。
- JButton(String icon):建立一个有文字的按钮。
- JButton(String text,Icon icon):建立一个有图像与文字的按钮。
由JButton的构造函数可以看出:JButton与JLabel的使用相当类似,只是JButton少了排列方式的参数罢了。要是我们想设置 JButton内文字或图像的水平排列方式,我们可以利用AbstractButton抽象类所提供的setHorizontalAlignment()方法来达成。 JButton在使用上与JLabel相当类似,只是类的设计方式有所不同,JLabel类自行提供组件排列方式的方法,而JButton是继承 AbstractButton抽象类的方法来排列按钮内的内容。为什么JButton不自行提供排列方式等方法呢?主要是因为JButton与JMenuItem 、JToggleButton、JCheckBox、JRadioButton组件有许多共同的物性,例如它们都会有“按”的操作、都可以插入Icon与文字、 都可设置快捷键、都可呈现Enable或Disable状态等等,因此将AbstractButton类独立出来,实现这些共通的方法,再由其他类来继 承,将可增加程序结构对象化与模块化的特性,也让程序更容易维护.
JButton类所提供的方法非常少,大部份都会用到AbstractButton抽象类所提供的方法。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JButtonDemo1 {
public static void main(String[] args) {
JFrame f = new JFrame("JButtonDemo1");
Container contentPane = f.getContentPane();
/*
* 你也可以用下面这个方式代替:JButton b=new JButton();b.setIcon(new
* ImageIcon(".\\icons\\hand.jpg"));b.setText("按我");
*/
JButton b = new JButton("按我", new ImageIcon(".\\icons\\hand.jpg"));
/*
* 如果没有设置文字的位置,系统默认值会将文字置于图形的右边中间位置。
*/
b.setHorizontalTextPosition(JButton.CENTER);
b.setVerticalTextPosition(JButton.BOTTOM);
contentPane.add(b);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
6-4-1:在JButton上使用Rollover图像变化:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RolloverDemo {
public static void main(String[] args) {
JFrame f = new JFrame("RolloverDemo");
Container contentPane = f.getContentPane();
Icon rollover = new ImageIcon(".\\icons\\address1.jpg");
Icon general = new ImageIcon(".\\icons\\address2.jpg");
Icon press = new ImageIcon(".\\icons\\address3.jpg");
JButton b = new JButton();
b.setRolloverEnabled(true);// 将Rollver功能打开。
b.setIcon(general);
b.setRolloverIcon(rollover);
b.setPressedIcon(press);
contentPane.add(b);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
6-4-2:在JButton上设置快捷键:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MnemonicButton implements ActionListener {
public MnemonicButton() {
JFrame f = new JFrame("MnemonicButton");
Container contentPane = f.getContentPane();
JButton b = new JButton("[o]打开新窗口");
b.setMnemonic('o');
/*
* 将b加入事件处理模式,当我们按下按钮时,会产生一个事件(ActionEvent),此事件会被ActionListener
* 所接收。而ActionListener是一个interface,里面只有actionPerformed()一个方法,因此我们必须实现
* actionPerformed()方法,处理我们所要的结果。
*/
b.addActionListener(this);
contentPane.add(b);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e) {
JFrame newf = new JFrame("新窗口");
JLabel label = new JLabel("这是新窗口");
label.setHorizontalAlignment(JLabel.CENTER);
newf.getContentPane().add(label);
newf.setSize(100, 100);
newf.show();
}
public static void main(String[] args) {
new MnemonicButton();
}
}
6-4-3:设置默认按钮:
在java中要设置默认按钮可以使用JRootPane类所提供的setDefaultButton()方法,下面的例子我们将事件处理模式换成另 一种写法,也就是前面所提到的Inner Class匿名类写法,因此在类DefaultButton的右边就不用再写入implements ActionListener 了。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DefaultButton {
public DefaultButton() {
JFrame f = new JFrame("DefaultButton");
Container contentPane = f.getContentPane();
contentPane.setLayout(new GridLayout(1, 2));
JButton b1 = new JButton("Open Text window");
JButton b2 = new JButton("Open Image window");
b1.setMnemonic('T');
b2.setMnemonic('I');
f.getRootPane().setDefaultButton(b1);
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFrame newf = new JFrame("新窗口");
JLabel label = new JLabel("这是文字窗口");
label.setHorizontalAlignment(JLabel.CENTER);
newf.getContentPane().add(label);
newf.setSize(200, 200);
newf.show();
}
});
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFrame newf = new JFrame("新窗口");
JLabel label = new JLabel(new ImageIcon(
".\\icons\\address1.jpg"));
label.setHorizontalAlignment(JLabel.CENTER);
newf.getContentPane().add(label);
newf.setSize(200, 200);
newf.show();
}
});
contentPane.add(b1);
contentPane.add(b2);
f.pack();
f.show();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new DefaultButton();
}
}