(2)编写createFrameButton()方法,该方法负责创建Action对象,该对象用于创建并显示窗体对象。另外,它还包含图标、文本等属性。如果将Action对象添加到系统菜单栏或者工具栏中,会直接创建相应的菜单项和工具按钮,而且这些菜单项和工具按钮将显示Action对象中的文本和图标属性。本系统没有使用系统菜单,所以该方法将直接创建按钮对象。关键代码如下:
例程06 代码位置:光盘\TM\01\JXCManager\src\com\lzw\JXCFrame.java
private JButton createFrameButton(String fName, String cname) { //为内部窗体添加 Action 的方法
String imgUrl = "res/ActionIcon/" + fName + ".png";
String imgUrl_roll = "res/ActionIcon/" + fName + "_roll.png";
String imgUrl_down = "res/ActionIcon/" + fName + "_down.png";
Icon icon = new ImageIcon(imgUrl); //创建按钮图标
Icon icon_roll = null;
if (imgUrl_roll != null)
icon_roll = new ImageIcon(imgUrl_roll); //创建鼠标经过按钮时的图标
Icon icon_down = null;
if (imgUrl_down != null)
icon_down = new ImageIcon(imgUrl_down); //创建按钮按下的图标
Action action = new openFrameAction(fName, cname, icon); //用 openFrameAction 类创建 Action 对象
JButton button = new JButton(action);
button.setMargin(new Insets(0, 0, 0, 0));
button.setHideActionText(true);
button.setFocusPainted(false);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
if (icon_roll != null)
button.setRolloverIcon(icon_roll);
if (icon_down != null)
button.setPressedIcon(icon_down);
return button;
代码贴士
setMargin():该方法用于设置按钮的四周边界大小。
setHideActionText():该方法用于设置按钮隐藏Action对象中的文本信息,例如一个只显示图标的按钮可以取消文本使按钮更加美观。
setFocusPainted():该方法用于设置按钮获取焦点时,是否绘制焦点样式。导航面板取消了这个焦点样式,因为它破坏了按钮图标的美观性。
setBorderPainted():该方法用于设置是否绘制按钮的边框样式,导航面板取消了边框样式,因为按钮的图标需要覆盖整个按钮。
setContentAreaFilled():该方法用于设置是否绘制按钮图形,在不同的操作系统,甚至系统不同的皮肤样式中都有不同的图形。导航面板取消了按钮的图形效果,因为导航面板要使用图标绘制整个按钮。
setRolloverIcon():该方法用于设置鼠标经过按钮时,按钮所使用的图标。
setPressedIcon():该方法用于设置鼠标按下按钮时,按钮所使用的图标。
(3)编写内部类openFrameAction,它必须继承AbstractAction类实现Action接口。该类用于创建导航按钮的Action对象,并为每个导航按钮定义创建并显示不同窗体对象的动作监听器,这个监听器在按钮被按下时,调用getIFrame()方法获取相应的窗体对象,并显示在主窗体中。关键代码如下:
例程07 代码位置:光盘\TM\01\JXCManager\src\com\lzw\JXCFrame.java
protected final class openFrameAction extends AbstractAction { //主窗体菜单项的单击事件监听器
private String frameName = null;
private openFrameAction() {
}
public openFrameAction(String cname, String frameName, Icon icon) {
this.frameName = frameName;
putValue(Action.NAME, cname); //设置 Action 的名称
putValue(Action.SHORT_DESCRIPTION, cname); //设置 Action 的提示文本框
putValue(Action.SMALL_ICON, icon); //设置 Action 的图标
}
public void actionPerformed(final ActionEvent e) {
JInternalFrame jf = getIFrame(frameName); //调用 getIFrame() 方法
//在内部窗体关闭时,从内部窗体容器 ifs 对象中清除该窗体
jf.addInternalFrameListener(new InternalFrameAdapter() {
public void internalFrameClosed(InternalFrameEvent e) {
ifs.remove(frameName);
}
});
if (jf.getDesktopPane() == null) {
desktopPane.add(jf); //将窗体添加到主窗体中
jf.setVisible(true); //显示窗体
}
try {
jf.setSelected(true); //使窗体处于被选择状态
} catch (PropertyVetoException e1) {
e1.printStackTrace();
}
}
}
(4)编写getIFrame()方法,该方法负责创建指定名称的窗体对象。在方法中使用了Java的反射技术,调用不同窗体类的默认构造方法创建窗体对象。关键代码如下:
例程08 代码位置:光盘\TM\01\JXCManager\src\com\lzw\JXCFrame.java
private JInternalFrame getIFrame(String frameName) { //获取内部窗体的唯一实例对象
JInternalFrame jf = null;
if (!ifs.containsKey(frameName)) {
try {
Class fClass = Class.forName("internalFrame." + frameName);
Constructor constructor = fClass.getConstructor(null);
jf = (JInternalFrame) constructor.newInstance(null);
ifs.put(frameName, jf);
} catch (Exception e) {
e.printStackTrace();
}
} else
jf = ifs.get(frameName);
return jf;
}