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的构造函数可以看出: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); } }); } }
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); } }); } }
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(); } }
在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(); } }