既然已经理解了布局管理器和事件模型,那么现在可以学习如何使用Swing组件了。本节将引导你大致浏览一下Swing组件,并介绍其最常使用的功能。每个例子都尽可能小,这样就很容易抽出所需代码,将其应用到自己的程序中。

一、按钮

    Swing提供了许多类型的按钮。所有的按钮,包括复选框、单选按钮,甚至菜单项,都是从AbstractButton(因为包含了菜单项,所以将其命名为“AbstractSelector”或者其他概括性的名字似乎更恰当一些)继承而来。很快你就会看到菜单项的使用,下面的例子演示了几种按钮:

package gui;

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JToggleButton;
import javax.swing.border.TitledBorder;
import javax.swing.plaf.basic.BasicArrowButton;

import com.buba.util.SwingConsole;

public class Buttons extends JFrame {
	private JButton jb = new JButton("JButton");
	private BasicArrowButton up = new BasicArrowButton(BasicArrowButton.NORTH),
			down = new BasicArrowButton(BasicArrowButton.SOUTH), right = new BasicArrowButton(BasicArrowButton.EAST),
			left = new BasicArrowButton(BasicArrowButton.WEST);

	public Buttons() {
		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("Directions"));
		jp.add(up);
		jp.add(down);
		jp.add(left);
		jp.add(right);
		add(jp);
	}

	public static void main(String[] args) {
		SwingConsole.run(new Buttons(), 350, 200);
	}
}

Java swing报表控件 javaswing常用控件_java

    程序开始加入了来自javax.swing.plaf.basic的BasicArrowButton,然后又加入了几种不同类型的按钮。运行例子,你会发现触发器按钮(JToggleButton)能保持自身最新的状态:按下或者弹出。不过复选框和单选按钮看起来差不多,也都是在开和关之间切换(它们都是从JToggleButton继承而来)。

(1)按钮组

    要想让单选按钮表现出某种“排它”行为,必须把它们加入到一个“按钮组”(ButtonGroup)中。不过,正如下面的例子所演示的,任何AbstractButton对象都可以加入到按钮组中。

    为了避免重复编写大量的代码,下面这个例子使用了反射功能来产生几组不同类型的按钮。注意makeBPanel()方法,它用来创建一个按钮组和一个JPanel,此方法的第二个参数是一个字符串数组。针对其中每个字符串,将创建一个由第一参数所代表的按钮实例,然后将此按钮加入到JPanel中:

package gui;

import java.awt.FlowLayout;
import java.lang.reflect.Constructor;

import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JToggleButton;
import javax.swing.border.TitledBorder;

import com.buba.util.SwingConsole;

public class ButtonGroups extends JFrame {
	private static String[] ids = { "June", "Ward", "Beaver", "Wally", "Eddie", "Lumpy" };

	static JPanel makeBPanel(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);
				// Create a new Object
				ab = (AbstractButton) ctor.newInstance(id);
			} catch (Exception e) {
				System.err.println("can't create " + kind);
			}
			bg.add(ab);
			jp.add(ab);
		}
		return jp;
	}

	public ButtonGroups() {
		setLayout(new FlowLayout());
		add(makeBPanel(JButton.class, ids));
		add(makeBPanel(JToggleButton.class, ids));
		add(makeBPanel(JCheckBox.class, ids));
		add(makeBPanel(JRadioButton.class, ids));
	}

	public static void main(String[] args) {
		SwingConsole.run(new ButtonGroups(), 500, 350);
	}
}

Java swing报表控件 javaswing常用控件_Swing_02

    边框的标题是从类的名称中得到的,并且去掉了其中的路径信息。AbstractButton被初始化为一个标签为“Failed”的JButton对象,所以即使你忽略了异常,仍旧能够在屏幕上观察到失败。getConstructor()方法产生一个Constructor对象,这个构造器对象接受“传递给getConstructor()的Class列表里面指定的类型”所组成的数组作为参数。然后你要做的就是调用newInstance(),并且把包含实际参数列表传递给它,在本例中就是ids数组中的字符串。

    要想通过按钮得到“排它”行为,就得先创建一个按钮组,然后把你希望具有“排它”行为的按钮加入到这个按钮组中。运行程序,你将会发现除了JButton以外,其他按钮都具有了这种“排它”行为。

二、图标

    可以在JLabel或者任何从AbstractButton(包括JButton、JCheckBox、JRadioButton以及几种不同JMenuItem)继承的组件中使用Icon。和JLabel一起使用Icon的做法非常直接(后面有例子)。下面的例子还研究了与按钮(或者从按钮继承的组件)搭配使用图标的所有方式。

    可以使用任何想用的图片文件,要打开一个文件并且得到图形,只需创建一个ImageIcon对象并把文件名传递给它即可。然后,就能在程序中使用得到的图标了。

package gui;

import java.awt.FlowLayout;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;

import com.buba.util.SwingConsole;

public class Faces extends JFrame {
	private static Icon[] faces;
	private JButton jb, jb2 = new JButton("Disable");
	private boolean mad = false;

	public Faces() {
		faces = new Icon[] { new ImageIcon(getClass().getResource("../Icon/Face0.png")),
				new ImageIcon(getClass().getResource("../Icon/Face1.png")),
				new ImageIcon(getClass().getResource("../Icon/Face2.png")),
				new ImageIcon(getClass().getResource("../Icon/Face3.png")),
				new ImageIcon(getClass().getResource("../Icon/Face4.png")) };
		jb = new JButton("JButton", faces[3]);
		setLayout(new FlowLayout());
		jb.addActionListener(e -> {
			if (mad) {
				jb.setIcon(faces[3]);
				mad = false;
			} else {
				jb.setIcon(faces[0]);
				mad = true;
			}
			jb.setVerticalAlignment(JButton.TOP);
			jb.setHorizontalAlignment(JButton.LEFT);
		});
		jb.setRolloverEnabled(true);
		jb.setRolloverIcon(faces[1]);
		jb.setPressedIcon(faces[2]);
		jb.setDisabledIcon(faces[4]);
		jb.setToolTipText("Yow!");
		add(jb);
		jb2.addActionListener(e -> {
			if (jb.isEnabled()) {
				jb.setEnabled(false);
				jb2.setText("Enable");
			} else {
				jb.setEnabled(true);
				jb2.setText("Disable");
			}
		});
		add(jb2);
	}

	public static void main(String[] args) {
		SwingConsole.run(new Faces(), 350, 225);
	}
}

    许多不同的Swing组件的构造器都接受Icon类型的参数,也可以使用setIcon()来加入或者改变图标。本例还演示了如何让JButton(或者任何AbstractButton类型)在各种情况下显示不同的图标:按下、禁止,或者“浮动”(鼠标移动到按钮上没有点击的时候)。这使得按钮具有了相当不错的动画效果。

三、工具提示

    前面的例子给按钮添加了一个“工具提示”。用来创建用户接口的类,绝大多数都是从JComponent派生而来的,它们包含了一个setToolText(String)方法。所以,对于要放置在窗体上的组件,基本上所要做的就是(对于任何JComponent派生类的对象jc)想这样写:

jc.setToolTipText("Yow!");

    当鼠标停留在这个JComponent上经过一段预先指定的时间之后,在鼠标旁边弹出的小方框里就会出现你所设定的文字。

如果本文对您有很大的帮助,还请点赞关注一下。