41. sysManagePanel.setBackground(new Color(215, 223, 194)); 42. sysManagePanel.setLayout(new BoxLayout
(sysManagePanel, BoxLayout.X_AXIS));
43. sysManagePanel.add(createFrameButton(\操作员管理\ 44. sysManagePanel.add(createFrameButton(\更改密码
\
45. sysManagePanel.add(createFrameButton(\权限管理
\
46. //将所有面板添加到导航面板中
47. tabbedPane.addTab(\基础信息管理 \
baseManagePanel, \基础信息管理\
48. tabbedPane.addTab(\进货管理 \
stockManagePanel, \进货管理\
49. tabbedPane.addTab(\销售管理 \
sellManagePanel, \销售管理\
50. tabbedPane.addTab(\查询统计 \
searchStatisticPanel, \查询统计\
51. tabbedPane.addTab(\库存管理 \
depotManagePanel, \库存管理\
52. tabbedPane.addTab(\系统管理 \
sysManagePanel, \系统管理\ 53. return tabbedPane; 54. }
(2)编写createFrameButton()方法,该方法负责创建Action对象,该对象用于创建并显示窗体对象。另外,它还包含图标、文本等属性。如果将Action对象添加到系统菜单栏或者工具栏中,会直接创建相应的菜单项和工具按钮,而且这些菜单项和工具按钮将显示Action对象中的文本和图标属性。本系统没有使用系统菜单,所以该方法将直接创建按钮对象。关键代码如下:
例程06 代码位置:光盘\\TM\\01\\JXCManager\\src\\com\\lzw\\JXCFrame.java
1. 2. 3. 4. 5. 6. 7. 8. 9.
private JButton createFrameButton(String fName, String cname) { //为内部窗体添加 Action 的方法
String imgUrl = \ + fName + \
String imgUrl_roll = \ + fName + \ String imgUrl_down = \ + fName + \ Icon icon = new ImageIcon(imgUrl); //创建按钮图标
Icon icon_roll = null; if (imgUrl_roll != null)
icon_roll = new ImageIcon(imgUrl_roll); //创建鼠标经过按钮时的图标 Icon icon_down = null;
10. if (imgUrl_down != null)
11. icon_down = new ImageIcon(imgUrl_down);
//创建按钮按下的图标
12. Action action = new openFrameAction(fName, cname,
icon); //用 openFrameAction 类创建 Action 对象 13. JButton button = new JButton(action); 14. button.setMargin(new Insets(0, 0, 0, 0)); ? 15. button.setHideActionText(true); ? 16. button.setFocusPainted(false); ? 17. button.setBorderPainted(false); ? 18. button.setContentAreaFilled(false); ? 19. if (icon_roll != null)
20. button.setRolloverIcon(icon_roll); ? 21. if (icon_down != null)
22. button.setPressedIcon(icon_down); ? 23. return button; 1.5.2 创建导航面板(2) 代码贴士
setMargin():该方法用于设置按钮的四周边界大小。
setHideActionText():该方法用于设置按钮隐藏Action对象中的文本信息,例如一个只显示图标的按钮可以取消文本使按钮更加美观。
setFocusPainted():该方法用于设置按钮获取焦点时,是否绘制焦点样式。导航面板取消了这个焦点样式,因为它破坏了按钮图标的美观性。
setBorderPainted():该方法用于设置是否绘制按钮的边框样式,导航面板取消了边框样式,因为按钮的图标需要覆盖整个按钮。
setContentAreaFilled():该方法用于设置是否绘制按钮图形,在不同的操作系统,甚至系统不同的皮肤样式中都有不同的图形。导航面板取消了按钮的图形效果,因为导航面板要使用图标绘制整个按钮。 setRolloverIcon():该方法用于设置鼠标经过按钮时,按钮所使用的图标。 setPressedIcon():该方法用于设置鼠标按下按钮时,按钮所使用的图标。
(3)编写内部类openFrameAction,它必须继承AbstractAction类实现Action接口。该类用于创建导航按钮的Action对象,并为每个导航按钮定义创建并显示不同窗体对象的动作监听器,这个监听器在按钮被按下时,调用getIFrame()方法获取相应的窗体对象,并显示在主窗体中。关键代码如下: 例程07 代码位置:光盘\\TM\\01\\JXCManager\\src\\com\\lzw\\JXCFrame.java
1.
protected final class openFrameAction extends AbstractAction { //主窗体菜单项的单击事件监听器
2. 3. 4. 5. 6. 7. 8. 9.
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 的图标
10. }
11. public void actionPerformed(final ActionEvent e) { 12. JInternalFrame jf = getIFrame(frameName);
//调用 getIFrame() 方法
13. //在内部窗体关闭时,从内部窗体容器 ifs 对象中清除该窗体
14. jf.addInternalFrameListener(new InternalFrameAdapter() { 15. public void internalFrameClosed(InternalFrameEvent e) {
16. ifs.remove(frameName); 17. } 18. });
19. if (jf.getDesktopPane() == null) {
20. desktopPane.add(jf);
//将窗体添加到主窗体中
21. jf.setVisible(true);
//显示窗体 22. } 23. try {
24. jf.setSelected(true);
//使窗体处于被选择状态
25. } catch (PropertyVetoException e1) { 26. e1.printStackTrace(); 27. } 28. } 29. }
(4)编写getIFrame()方法,该方法负责创建指定名称的窗体对象。在方法中使用了Java的反射技术,调用不同窗体类的默认构造方法创建窗体对象。关键代码如下:
例程08 代码位置:光盘\\TM\\01\\JXCManager\\src\\com\\lzw\\JXCFrame.java
1.
private JInternalFrame getIFrame(String frameName) { //获取内部窗体的唯一实例对象
2. 3. 4. 5. 6. 7. 8. 9.
JInternalFrame jf = null;
if (!ifs.containsKey(frameName)) { try {
Class fClass = Class.forName(\e);
Constructor constructor = fClass.getConstructor(null); jf = (JInternalFrame) constructor.newInstance(null); ifs.put(frameName, jf); } catch (Exception e) {
10. e.printStackTrace(); 11. } 12. } else
13. jf = ifs.get(frameName); 14. return jf; 15. } 1.6 公共模块设计
在本系统的项目空间中,有部分模块(或者是多个模块甚至整个系统的配置信息)是公用的,它们被多个模块重复调用完成指定的业务逻辑,本节将这些公共模块提出来加以单独介绍。 1.6.1 编写Dao公共类(1)
Dao类主要负责有关数据库的操作,该类在静态代码段中驱动并连接数据库,然后将所有的数据库访问方法定义为静态的。本节将介绍Dao类中有关数据库操作的关键方法。Dao类的定义代码如下: 例程09 代码位置:光盘\\TM\\01\\JXCManager\\src\\com\\lzw\\dao\\Dao.java
1. 2. 3. 4. 5. 6. 7. 8. 9.
public class Dao {
protected static String ?dbClassName = \microsoft.jdbc.sqlserver.SQLServerDriver\;
protected static String ?dbUrl = \sqlserver://localhost:1433;\
+ \DatabaseName=db_JXC;SelectMethod=Cursor\ protected static String ?dbUser = \; protected static String ?dbPwd = \; protected static String second = null; public static Connection ?conn = null; static {
10. try {
11. if (conn == null) {
12. Class.forName(dbClassName).newInstance();
//加载数据库驱动类
13. conn = DriverManager.getConnection(dbUrl,
dbUser, dbPwd); //获取数据库连接
14. }
15. } catch (Exception ee) { 16. ee.printStackTrace(); 17. } 18. } 19. } 代码贴士
dbClassName:该成员变量用于定义数据库驱动类的名称。 dbUrl:该成员变量用于定义访问数据库的URL路径。 dbUser:该成员变量用于定义访问数据库的用户名称。 dbPwd:该成员变量用于定义访问数据库的用户密码。 conn:该成员变量用于定义连接数据库的对象。 1.addGys()方法
该方法用于添加供应商的基础信息,它接收供应商的实体类TbGysinfo作方法的参数,然后把实体对象中的所有属性存入供应商数据表中。关键代码如下:
例程10 代码位置:光盘\\TM\\01\\JXCManager\\src\\com\\lzw\\dao\\Dao.java
1. 2. 3. 4. 5. 6. 7. 8. 9.
//添加供应商信息的方法
public static boolean addGys(TbGysinfo gysInfo) { if (gysInfo == null) //如果供应商实体对象为空
return false; //则返回false
return insert(\getId() + \执行供应商添加
+ gysInfo.getName() + \ + gysInfo.getAddress() + \','\
+ gysInfo.getTel() + \ + gysInfo.getLian() + \
10. + gysInfo.getMail() + \ 11. } 2.getGysInfo()方法