Java项目开发全程实录(第3版)1.4.4创建数据库在导出数据库脚本文件后,即可在查询分析器中执行该脚本来创建数据库及数据表。具体步骤如下:(1)选择“开始”/“所有程序”/MicrosoftSQLServer/“查询分析器”命令,在弹出的“连接到SQLServer”对话框中输入访问数据库的“登录名”和“密码”,如图1.18所示。单击“确定”按钮。(2)在打开的SOL查询分析器中选择“文件”“打开”命令,在弹出的对话框中选择数据库脚本文件,然后单击“打开”按钮,返回查询分析器,选择执行脚本的数据库,然后单击按钮执行脚本中的命令创建数据库的表结构,如图1.19所示。SQL查询分析香连接到SQLServer区-[查询LZVSKYWxcljxe...DX选择数据库文件编辑IAD)查语(Q)BrocalSQLServer(S·家日的VDD0执行按钮Uab_Jxc厂周SDL vw已停止,周1对量试克器()K2000DBIS naneNicroLS(G)-谨接使用一广Wrdons身份验证F00(SQLSever身份验证图aboxceeTan爱界名Lsa1LLhrarfrom dbo.c)doabwhere r.fkeyid = objed密码()>智对量模板】2VSY(8.0)(1)bJXC000:000行行5列图销定a0连接M图1.18“连接到SQLServer”对话框图1.19查询分析器运行效果1.5主窗体设计主窗体界面也是该系统的欢迎界面。应全业进销存营理系技80区#电世行n1用程序的主窗体必须设计层次清晰的系统名信量管型商品国业营息管定菜单和工具栏,其中系统菜单包含系统中所有功能的菜单项,而工具栏主要提供常用功能的快捷访问按钮。企业进销存管理系统采用导航面板综合了系统菜单和工具栏的优点,而且导航面板的界面更加美观,操作更快捷。主窗体的界面效果如图1.20所示。1.5.1创建主窗体创建主窗体的步骤如下:功双科技(1)创建JXCFrame类,在类中创建并图1.20程序主窗体界面效果初始化窗体对象,为窗体添加桌面面板,并设置背景图片。关键代码如下:14
Java 项目开发全程实录(第 3 版) 14 1.4.4 创建数据库 在导出数据库脚本文件后,即可在查询分析器中执行该脚本来创建数据库及数据表。具体步骤 如下: (1)选择“开始”/“所有程序”/Microsoft SQL Server/“查询分析器”命令,在弹出的“连接到 SQL Server”对话框中输入访问数据库的“登录名”和“密码”,如图 1.18 所示。单击“确定”按钮。 (2)在打开的 SQL 查询分析器中选择“文件”/“打开”命令,在弹出的对话框中选择数据库脚 本文件,然后单击“打开”按钮,返回查询分析器,选择执行脚本的数据库,然后单击 按钮执行脚 本中的命令创建数据库的表结构,如图 1.19 所示。 选择数据库 执行按钮 图 1.18 “连接到 SQL Server”对话框 图 1.19 查询分析器运行效果 1.5 主窗体设计 主窗体界面也是该系统的欢迎界面。应 用程序的主窗体必须设计层次清晰的系统 菜单和工具栏,其中系统菜单包含系统中所 有功能的菜单项,而工具栏主要提供常用功 能的快捷访问按钮。企业进销存管理系统采 用导航面板综合了系统菜单和工具栏的优 点,而且导航面板的界面更加美观,操作更 快捷。主窗体的界面效果如图 1.20 所示。 1.5.1 创建主窗体 创建主窗体的步骤如下: (1)创建 JXCFrame 类,在类中创建并 初始化窗体对象,为窗体添加桌面面板,并 设置背景图片。关键代码如下: 图 1.20 程序主窗体界面效果
第1章进销存管理系统(Swing+SOLServer2000实现)白食例程01代码位置:光盘\TMo1UXCManagerlsrclcom\IzwUXCFrame.javaprivateJDesktopPanedesktopPane;private JFrame frame;privateJLabel backLabel;private Preferences preferences://创建窗体的Map类型集合对象privateMap<String,JInternalFrame>ifs=newHashMap<String,JInternalFrame>();public JXCFrame0I/创建窗体对象frame=newJFrame("企业进销存管理系统");frame.addComponentListener(newFrameListener():I添加窗体事件监听器/设置布局管理器frame.getContentPane().setLayout(newBorderLayout():frame.setBounds(100,100,800,600);1/设置窗体位置和大小frame.setDefaultCloseOperation(JFrame.EXITONCLOSE)1/设置窗体默认的关闭方式1/背景标签backLabel=newJLabel():backLabel.setVerticalAlignment(SwingConstants.TOP):/设置背景标签垂直对齐方式backLabel.setHorizontalAlignment(SwingConstants.CENTER);1/设置背景标签水平对齐方式I调用初始化背景标签的方法updateBackimage();1/创建桌面面板desktopPane=newJDesktopPane():desktopPane.add(backLabel,newInteger(Integer.MINVALUE));1/将背景标签添加到桌面面板中I/添加桌面面板到窗体中frame.getContentPane().add(desktopPane):JTabbedPanenavigationPanel=createNavigationPanelO);/创建导航面板I添加导航面板到窗体中frame.getContentPane().add(navigationPanel,BorderLayout.NORTH):frame.setVisible(true);Ⅱ显示窗体1(2)编写updateBackImageO方法,在该方法中初始化背景标签,背景标签使用HTML超文本语言设置了主窗体的背景图片,该图片将随主窗体的大小自动缩放。关键代码如下:例程02代码位置:光盘\TM\o1VXCManagerlsrclcomllzwUXCFrame.javaprivate void updateBacklmage()(if (backLabel = null) (int backw=JXCFrame.this.frame.getWidth():int backh=frame.getHeight();I/初始化背景标签的大小backLabel.setSize(backw,backh);backLabel.setText(<html><body><image width="+ backw+" height="" + (backh -110) +" src="+JxCFrame.this.getClass().getResource("welcome.jpg")+"></img></body></html>");:1/设置背景标签的图像(3)在类的静态代码段中设置进销存管理系统的外观样式。Swing支持跨平台特性,它可以在不同的操作系统中保持一致的外观风格,但是本系统使用UIManager类的setLookAndFeelO方法设置程序界面使用本地外观,这样可以使程序更像本地应用程序。关键代码如下:例程03代码位置:光盘\TM\o1VUXCManagerlsrclcom\lzwUXCFrame.javastatic (try(
第 1 章 进销存管理系统(Swing+SQL Server 2000 实现) 15 例程 01 代码位置:光盘\TM\01\JXCManager\src\com\lzw\JXCFrame.java private JDesktopPane desktopPane; private JFrame frame; private JLabel backLabel; private Preferences preferences; //创建窗体的 Map 类型集合对象 private Map<String, JInternalFrame> ifs = new HashMap<String, JInternalFrame>(); public JXCFrame() { frame = new JFrame("企业进销存管理系统"); //创建窗体对象 frame.addComponentListener(new FrameListener()); //添加窗体事件监听器 frame.getContentPane().setLayout(new BorderLayout()); //设置布局管理器 frame.setBounds(100, 100, 800, 600); //设置窗体位置和大小 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置窗体默认的关闭方式 backLabel = new JLabel(); //背景标签 backLabel.setVerticalAlignment(SwingConstants.TOP); //设置背景标签垂直对齐方式 backLabel.setHorizontalAlignment(SwingConstants.CENTER); //设置背景标签水平对齐方式 updateBackImage(); //调用初始化背景标签的方法 desktopPane = new JDesktopPane(); //创建桌面面板 desktopPane.add(backLabel, new Integer(Integer.MIN_VALUE)); //将背景标签添加到桌面面板中 frame.getContentPane().add(desktopPane); //添加桌面面板到窗体中 JTabbedPane navigationPanel = createNavigationPanel(); //创建导航面板 frame.getContentPane().add(navigationPanel, BorderLayout.NORTH); //添加导航面板到窗体中 frame.setVisible(true); //显示窗体 } (2)编写 updateBackImage()方法,在该方法中初始化背景标签,背景标签使用 HTML 超文本语 言设置了主窗体的背景图片,该图片将随主窗体的大小自动缩放。关键代码如下: 例程 02 代码位置:光盘\TM\01\JXCManager\src\com\lzw\JXCFrame.java private void updateBackImage() { if (backLabel != null) { int backw = JXCFrame.this.frame.getWidth(); int backh = frame.getHeight(); backLabel.setSize(backw, backh); //初始化背景标签的大小 backLabel.setText("<html><body><image width='" + backw + "' height='" + (backh - 110) + "' src=" + JXCFrame.this.getClass().getResource("welcome.jpg") + "'></img></body></html>"); //设置背景标签的图像 } } (3)在类的静态代码段中设置进销存管理系统的外观样式。Swing 支持跨平台特性,它可以在不 同的操作系统中保持一致的外观风格,但是本系统使用 UIManager 类的 setLookAndFeel()方法设置程序 界面使用本地外观,这样可以使程序更像本地应用程序。关键代码如下: 例程 03 代码位置:光盘\TM\01\JXCManager\src\com\lzw\JXCFrame.java static { try {
Java项目开发全程实录(第3版)UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName():} catch (Exception e)(e.printStackTraceO:1(4)编写主窗体的main入口方法,在该方法中创建登录窗体对象,登录窗体会验证登录信息,并显示主窗体界面。关键代码如下:例程04代码位置:光盘\TM/o1VXCManagerlsrclcomlzwUXCFrame.javapublic static void main(Stringargs)(SwingUtilities.invokeLater(newRunnable()(public void runO(new Login();13);11.5.2创建导航面板创建导航面板的步骤如下:(1)在JXCFrame类中编写createNavigationPanelO方法,在该方法中创建JTabbedPane选项卡面板对象。为突出选项卡的立体效果,设置该选项卡使用BevelBorder边框效果,然后依次创建基础信息管理、库存管理、销售管理、查询统计、进货管理和系统管理的选项卡。关键代码如下:例程05代码位置:光盘\TM/o1VXCManagerlsrclcom\IzwUXCFrame.javaprivateJTabbedPane createNavigationPanel()I/创建导航面板的方法JTabbedPanetabbedPane=newJTabbedPane()tabbedPane.setFocusable(false);tabbedPane.setBackground(newColor(211,230,192));tabbedPane.setBorder(newBevelBorder(BevelBorder.RAISED);I/基础信息管理面板JPanelbaseManagePanel=newJPanel();baseManagePanel.setBackground(newColor(215,223,194);baseManagePanel.setLayout(newBoxLayout(baseManagePanel,BoxLayout.XAXiS)):baseManagePanel.add(createFrameButton("客户信息管理","KeHuGuanLi")):baseManagePanel.add(createFrameButton("商品信息管理","ShangPinGuanLi");baseManagePanel.add(createFrameButton("供应商信息管理","GysGuanLi"));1/库存管理面板JPaneldepotManagePanel=newJPanel(O);depotManagePanel.setBackground(newColor(215,223,194);depotManagePanel.setLayout(newBoxLayout(depotManagePanel,BoxLayout.X_AXiS);depotManagePanel.add(createFrameButton("库存盘点","KuCunPanDian");depotManagePanel.add(createFrameButton("价格调整","JiaGeTiaoZheng");//销售管理面板JPanelsellManagePanel=newJPanel():sellManagePanel.setBackground(newColor(215,223,194);sellManagePanel.setLayout(new BoxLayout(sellManagePanel, BoxLayout.X_AXiS);sellManagePanel.add(createFrameButton("销售单","XiaoShouDan");sellManagePanel.add(createFrameButton("销售退货,"XiaoShouTuiHuo"):16
Java 项目开发全程实录(第 3 版) 16 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } } (4)编写主窗体的 main()入口方法,在该方法中创建登录窗体对象,登录窗体会验证登录信息, 并显示主窗体界面。关键代码如下: 例程 04 代码位置:光盘\TM\01\JXCManager\src\com\lzw\JXCFrame.java public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new Login(); } }); } 1.5.2 创建导航面板 创建导航面板的步骤如下: (1)在 JXCFrame 类中编写 createNavigationPanel()方法,在该方法中创建 JTabbedPane 选项卡面 板对象。为突出选项卡的立体效果,设置该选项卡使用 BevelBorder 边框效果,然后依次创建基础信息 管理、库存管理、销售管理、查询统计、进货管理和系统管理的选项卡。关键代码如下: 例程 05 代码位置:光盘\TM\01\JXCManager\src\com\lzw\JXCFrame.java private JTabbedPane createNavigationPanel() { //创建导航面板的方法 JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.setFocusable(false); tabbedPane.setBackground(new Color(211, 230, 192)); tabbedPane.setBorder(new BevelBorder(BevelBorder.RAISED)); JPanel baseManagePanel = new JPanel(); //基础信息管理面板 baseManagePanel.setBackground(new Color(215, 223, 194)); baseManagePanel.setLayout(new BoxLayout(baseManagePanel, BoxLayout.X_AXIS)); baseManagePanel.add(createFrameButton("客户信息管理", "KeHuGuanLi")); baseManagePanel.add(createFrameButton("商品信息管理", "ShangPinGuanLi")); baseManagePanel.add(createFrameButton("供应商信息管理", "GysGuanLi")); JPanel depotManagePanel = new JPanel(); //库存管理面板 depotManagePanel.setBackground(new Color(215, 223, 194)); depotManagePanel.setLayout(new BoxLayout(depotManagePanel, BoxLayout.X_AXIS)); depotManagePanel.add(createFrameButton("库存盘点", "KuCunPanDian")); depotManagePanel.add(createFrameButton("价格调整", "JiaGeTiaoZheng")); JPanel sellManagePanel = new JPanel(); //销售管理面板 sellManagePanel.setBackground(new Color(215, 223, 194)); sellManagePanel.setLayout(new BoxLayout(sellManagePanel, BoxLayout.X_AXIS)); sellManagePanel.add(createFrameButton("销售单", "XiaoShouDan")); sellManagePanel.add(createFrameButton("销售退货", "XiaoShouTuiHuo"));
第1章进销存管理系统(Swing+SQLServer2000实现)白食JPanelsearchStatisticPanel=newJPanel();I/查询统计面板searchStatisticPanel.setBounds(0,0,600,41):searchStatisticPanel.setName("searchStatisticPanel");searchStatisticPanel.setBackground(newColor(215,223,194);SearchStatisticPanel.setLayout(newBoxLayout(searchStatisticPanel,BoxLayout.x_AxiS);searchStatisticPanel.add(createFrameButton("客户信息查询","KeHuChaXun");searchStatisticPanel.add(createFrameButton("商品信息查询","ShangPinChaXun");searchStatisticPanel.add(createFrameButton("供应商信息查询""GongYingShangChaXun"));searchStatisticPanel.add(createFrameButton("销售信息查询","XiaoShouChaXun");searchStatisticPanel.add(createFrameButton(销售退货查询"XiaoShouTuiHuoChaXun");searchStatisticPanel.add(createFrameButton("入库查询","RuKuChaXun"));searchStatisticPanel.add(createFrameButton("入库退货查询","RuKuTuiHuoChaXun"))searchStatisticPanel.add(createFrameButton("销售排行""XiaoShouPaiHang");//进货管理面板JPanelstockManagePanel=newJPanel()stockManagePanel.setBackground(newColor(215,223,194));stockManagePanel.setLayout(newBoxLayout(stockManagePanel,BoxLayout.xAXiS);stockManagePanel.add(createFrameButton("进货单","JinHuoDan");stockManagePanel.add(createFrameButton("进货退货,"JinHuoTuiHuo"):JPanelsysManagePanel=newJPanelO:I系统管理面板sysManagePanel.setBackground(newColor(215,223,194);sysManagePanel.setLayout(new BoxLayout(sysManagePanel, BoxLayout.X_AXiS);sysManagePanel.add(createFrameButton("操作员管理","CzyGL"))sysManagePanel.add(createFrameButton("更改密码","GengGaiMiMa");sysManagePanel.add(createFrameButton("权限管理","QuanManager"));I/将所有面板添加到导航面板中tabbedPane.addTab("基础信息管理",null,baseManagePanel,“基础信息管理")tabbedPane.addTab("进货管理",null,stockManagePanel,"进货管理");销售管理",null,sellManagePanel,"销售管理");tabbedPane.addTab("tabbedPane.addTab("",null,searchStatisticPanel,"查询统计");查询统计库存管理tabbedPane.addTab("",null,depotManagePanel,"库存管理");系统管理",null,sysManagePanel,"系统管理");tabbedPane.addTab("returntabbedPane;1(2)编写createFrameButtonO方法,该方法负责创建Action对象,该对象用于创建并显示窗体对象,另外,它还包含图标、文本等属性,如果将Action对象添加到系统菜单栏或者工具栏中,会直接创建相应的菜单项和工具按钮,而且这些菜单项和工具按钮将显示Action对象中的文本和图标属性。本系统没有使用系统菜单,所以该方法直接创建按钮对象。关键代码如下:例程06代码位置:光盘\TM/o1VXCManagerlsrclcom\zwUXCFrame.javaprivateJButtoncreateFrameButton(StringfName,Stringcname)I/为内部窗体添加Action的方法StringimgUrl="res/Actionlcon/"+fName+".png";String imgUrl_roll ="res/Actionlcon/"+ fName +"_rollpng";StringimgUrldown="res/Actionlcon/"+fName+"_down.png":I/创建按钮图标Iconicon=newImagelcon(imgUrl);Icon icon roll = null;if (imgUr_roll |= null)//创建鼠标经过按钮时的图标icon_roll=newImagelcon(imgUrlroll);Icon icon_down = null;if (imgUrldown!=null)
第 1 章 进销存管理系统(Swing+SQL Server 2000 实现) 17 JPanel searchStatisticPanel = new JPanel(); //查询统计面板 searchStatisticPanel.setBounds(0, 0, 600, 41); searchStatisticPanel.setName("searchStatisticPanel"); searchStatisticPanel.setBackground(new Color(215, 223, 194)); searchStatisticPanel.setLayout(new BoxLayout(searchStatisticPanel, BoxLayout.X_AXIS)); searchStatisticPanel.add(createFrameButton("客户信息查询", "KeHuChaXun")); searchStatisticPanel.add(createFrameButton("商品信息查询", "ShangPinChaXun")); searchStatisticPanel.add(createFrameButton("供应商信息查询","GongYingShangChaXun")); searchStatisticPanel.add(createFrameButton("销售信息查询", "XiaoShouChaXun")); searchStatisticPanel.add(createFrameButton("销售退货查询","XiaoShouTuiHuoChaXun")); searchStatisticPanel.add(createFrameButton("入库查询", "RuKuChaXun")); searchStatisticPanel.add(createFrameButton("入库退货查询", "RuKuTuiHuoChaXun")); searchStatisticPanel.add(createFrameButton("销售排行", "XiaoShouPaiHang")); JPanel stockManagePanel = new JPanel(); //进货管理面板 stockManagePanel.setBackground(new Color(215, 223, 194)); stockManagePanel.setLayout(new BoxLayout(stockManagePanel, BoxLayout.X_AXIS)); stockManagePanel.add(createFrameButton("进货单", "JinHuoDan")); stockManagePanel.add(createFrameButton("进货退货", "JinHuoTuiHuo")); JPanel sysManagePanel = new JPanel(); //系统管理面板 sysManagePanel.setBackground(new Color(215, 223, 194)); sysManagePanel.setLayout(new BoxLayout(sysManagePanel, BoxLayout.X_AXIS)); sysManagePanel.add(createFrameButton("操作员管理", "CzyGL")); sysManagePanel.add(createFrameButton("更改密码", "GengGaiMiMa")); sysManagePanel.add(createFrameButton("权限管理", "QuanManager")); //将所有面板添加到导航面板中 tabbedPane.addTab(" 基础信息管理 ", null, baseManagePanel, "基础信息管理"); tabbedPane.addTab(" 进货管理 ", null, stockManagePanel, "进货管理"); tabbedPane.addTab(" 销售管理 ", null, sellManagePanel, "销售管理"); tabbedPane.addTab(" 查询统计 ", null, searchStatisticPanel, "查询统计"); tabbedPane.addTab(" 库存管理 ", null, depotManagePanel, "库存管理"); tabbedPane.addTab(" 系统管理 ", null, sysManagePanel, "系统管理"); return tabbedPane; } (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)
Java项目开发全程实录(第3版)icon_down=newImagelcon(imgUrl_down);I/创建按钮按下的图标Actionaction=newopenFrameAction(fName, cname, icon)://用openFrameAction类创建Action对象JButtonbutton=newJButton(action);0button.setMargin(new Insets(0,0,0,0);?button.setHideActionText(true):?button.setFocusPainted(false);Obutton.setBorderPainted(false):button.setContentAreaFilled(false):if (icon_roll =null)6button.setRolloverlcon(icon_roll);if (icon_down!=null)0button.setPressedlcon(icon_down):returnbutton;代码贴士0setMarginO:该方法用于设置按钮的四周边界大小。③setHideActionTextO:该方法用于设置按钮隐藏Action对象中的文本信息,例如一个只显示图标的按钮可以取消文本使按钮更加美观。③setFocusPaintedO:该方法用于设置按钮获取焦点时,是否绘制焦点样式。导航面板取消了这个焦点样式,因为它破坏了按钮图标美观性。③setBorderPaintedO:该方法设置是否绘制按钮的边框样式,导航面板取消了边框样式,因为按钮的图标需要覆盖整个按钮。③setContentAreaFilledO:该方法设置是否绘制按钮图形,在不同的操作系统,甚至系统不同的皮肤样式中都有不同的图形。导航面板取消了按钮的图形效果,因为导航面板要使用图标绘制整个按钮,③setRolloverlconO:该方法用于设置鼠标经过按钮时,按钮所使用的图标。③setPressedlconO:该方法用于设置鼠标按下按钮时,按钮所使用的图标。(3)编写内部类openFrameAction,它必须继承AbstractAction类实现Action接口。该类用于创建导航按钮的Action对象,并为每个导航按钮定义创建并显示不同窗体对象的动作监听器,这个监听器在按钮被按下时,调用getIFrameO方法获取相应的窗体对象,并显示在主窗体中。关键代码如下:例程07代码位置:光盘\TM\1VXCManagerlsrclcomllzwUXCFrame.javaprotected final classopenFrameAction extends AbstractAction(I/主窗体菜单项的单击事件监听器private String frameName=null;privateopenFrameAction()publicopenFrameAction(Stringcname,StringframeName,Iconicon)this.frameName=frameName;putValue(Action.NAME,cname)//设置Action的名称putValue(Action.SHORT_DESCRIPTION,cname);//设置Action的提示文本框putValue(Action.SMALL_ICoN, icon);//设置Action的图标publicvoid actionPerformed(final ActionEvent e)JInternalFrame jf=getiFrame(frameName);/调用getiFrame()方法l在内部窗体关闭时,从内部窗体容器ifs对象中清除该窗体jf.addlnternalFrameListener(newInternalFrameAdapter()public voidinternalFrameClosed(InternalFrameEvente)18
Java 项目开发全程实录(第 3 版) 18 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) {