进销存管理系统(8)

(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;

}

读书导航