JAVA进销存管理系统攻坚笔记一

更新时间:2023-11-23 23:23:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

主窗体设计

public JXCFrame() {

}

frame = new JFrame(\企业进销存管理系统\);

frame.getContentPane().setBackground(new Color(170, 188, 120)); frame.getContentPane().setLayout(new BorderLayout()); frame.setBounds(100, 100, 800, 600);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);

执行后的结果如下:

public JXCFrame() {

}

frame = new JFrame(\企业进销存管理系统\);

frame.getContentPane().setBackground(new Color(170, 188, 120)); 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); desktopPane = new JDesktopPane();

desktopPane.add(backLabel, new Integer(Integer.MIN_VALUE)); frame.getContentPane().add(desktopPane); frame.setVisible(true);

灰色衬底部分代码实现了如下功能:创建了背景标签,并设置背景标签的垂直和水平对齐方式。创建了桌面面板,将背景标签添加到桌面面板中,并把桌面面板添加到窗体中。

注意:桌面面板JdesktopPane的不是透明的,所以当把桌面面板添加到窗体中后你会看到

窗体变为白色。

标签是用来显示信息常用的组件,大多数情况下,标签不需要响应事件,所以编程很简单。Swing中的标签一个突出的特点是可以放入图像,让程序外观更漂亮。 执行后的结果如下:

static {

}

try { }

UIManager.setLookAndFeel(

UIManager.getSystemLookAndFeelClassName());

} catch (Exception e) {

e.printStackTrace();

在类的静态代码段中设置进销存管理系统的外观样式。Swing支持跨平台特性,它可以在不同的操作系统中保持一致的外观风格,但是本系统使用UIManager类的setLookAndFeel()方法设置程序界面使用本地外观,这样可以是程序更像本地应用程序。 执行后的结果如下:

private void updateBackImage() {

}

if (backLabel != null) { }

int backw = JXCFrame.this.frame.getWidth(); int backh = frame.getHeight(); backLabel.setSize(backw, backh);

backLabel.setIcon(new ImageIcon(\));

在updateBackImage()方法中初始化背景标签,背景标签中加载了主窗体的背景图片,该图片将随主窗体的大小自动缩放。但是,此处未能实现,等待以后解决。 执行后的结果如下:

JTabbedPane tabbedPane = new JTabbedPane();

tabbedPane.setFocusable(false);

tabbedPane.setBackground(new Color(211, 230, 192));

tabbedPane.setBorder(new BevelBorder(BevelBorder.RAISED));

在createNavigationPanel()中创建JtabbedPane选项卡面板对象,JtabbedPane允许用户单击不同的标签来选择不同的选项卡中的组建,其中标签的位置可以在上方也可以在下方。

JtabbedPane中放置了六块面板,原理都一样,下面我们就以“基础信息管理面板”baseManagerPanel为例说一下个人理解思路。

// 基础信息管理面板 JPanel baseManagePanel = new JPanel();

baseManagePanel.setBackground(new Color(215, 223, 194)); baseManagePanel.setLayout(new BoxLayout(baseManagePanel,

BoxLayout.X_AXIS));

baseManagePanel.add(createFrameButton(\客户信息管理\, \));

baseManagePanel.add(createFrameButton(\商品信息管理\, \));

baseManagePanel.add(createFrameButton(\供应商信息管理\, \));

baseManagerPanel用的是BoxLayout布局管理器。BoxLayout是允许垂直或水平布置多个

组件的布局管理器。这些组件将不包装,因此举例来说,垂直排列的组件在重新调整框架大小时仍然是垂直排列。在这里我们用的是X_AXIS参数也就是从左到右水平布置组件。

将baseManagerPanel添加到tabbedPane面板时用的是JtabbedPane常用的添加组件方法 addTab(String title,Icon icon,Component component,String tip)方法。 title--此选项卡中要显示的标题;icon--此选项卡中要显示的图标;component—-单击此选项卡时要显示的组件;tip—-此选项卡要显示的工具提示。

baseManagerPanel中水平放置了三个Button按钮,分别是“客户信息管理”、“商品信息管理”和“供应商信息管理”。这三个按钮都是用createFrameButton()方法来创建的。 createFrameButton()方法负责创建Action对象,该对象用于创建并显示窗体对象,另外,它还包含图标、文本等属性,如果将Action对象添加到系统菜单栏或者工具栏中,会直接创建相应的菜单项和工具按钮,而且这些菜单项和工具按钮将显示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; if (imgUrl_down != null)

icon_down = new ImageIcon(imgUrl_down);

在JXCFrame中Button的构造都相似,由标题和图标两部分组成。本系统所有的图标都放在res/ActionIcon路径下,所以这里用相对路径来表示图标的位置,同时图表的名字和按钮的标题相同,这样可以将所有的图标统一起来,用一个String变量imgUrl就可以表示。 createFrameButton()方法将所有的构造Action对象的方法都统一起来,很值得借鉴。

Action action = new openFrameAction(fName, cname, icon);

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); button.setPressedIcon(icon_down); if (icon_down != null) return button;

Action在此系统中得到了很好的利用现在我们来总结一下Action接口。

Action 接口提供 ActionListener 接口的一个有用扩展,以便若干控件访问相同的功能。(解释一下这句话的含义:首先ActionListener用于接收操作事件的侦听器接口。对处理操作事件感兴趣的类可以实现此接口,而使用该类创建的对象可使用组件addActionListener

方法向该组件注册。在发生操作事件时,调用该对象的 actionPerformed 方法。) 为了简化事件处理,Swing库使用Action接口扩展了原始的ActionListener接口来存储具有事件处理器的可视属性。这使得事件处理器的创建独立于可视化组件。然后,当Action在稍后与一个组件相关联时,组件直接由事件处理器自动获取信息(例如按钮标签)。

ActionButton定义按钮和菜单项的一般行为。按钮可以进行配置,以及通过Action进行某种程度的控制。使用带有按钮的Action具有除直接配置按钮之外的许多优点。许多Swing的组件都具有Action属性。在组件上设置Action时,会发生一下几种情况:Action被作为ActionListener添加到组件;组件配置自身的某些属性以匹配Action;组建在Action上安装PropertyChangeListener,这样组件可更改其属性以反映 Action 属性中的更改。 下面是系统中用到的几个ActionButton方法: ? ?

setMargin():该方法用于设置按钮的四周边界大小。

setHideActionText():该方法用于设置按钮隐藏Action对象中的文本信息,例如一个只显示图标的按钮可以取消文本是按钮更加美观。我们来对比一下: 系统设置后的标准情况:

没有隐藏Action对象中的文本信息的情况:

?

setFocusPainted():该方法用于设置按钮获取焦点时,是否绘制焦点样式。导航面板取消了这个焦点样式,因为它破坏了按钮图标美观性。大家可以尝试一下,当参数设置为true时选中的按钮周围会有一个虚线方框,影像美观。 ?

setBorderPainted():该方法设置是否绘制按钮的边框样式,导航面板取消了边框样式,因为按钮的图标需要覆盖整个按钮。 没有取消边框样式的情况:

?

setContentAreaFilled():该方法设置是否绘制按钮图形,在不同的操作系统,甚至系统不同的皮肤样式中都有不同的图形。导航面板取消了按钮的图形效果,因为导航面板要使用图标绘制整个按钮。 没有取消按钮图形效果的情况:

? ?

setRolloverIcon():该方法用于设置鼠标经过按钮时,按钮所使用的图标。 setPressedIcon():该方法用于设置鼠标按下时,按钮所使用的图标。

// 主窗体菜单项的单击事件监听器 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);

// 在内部窗体闭关时,从内部窗体容器ifs对象中清除该窗体。

jf.addInternalFrameListener(new InternalFrameAdapter() {

public void internalFrameClosed(InternalFrameEvent e) { }

ifs.remove(frameName);

});

if (jf.getDesktopPane() == null) { } try { }

jf.setSelected(true); e1.printStackTrace();

} catch (PropertyVetoException e1) {

desktopPane.add(jf); jf.setVisible(true);

openFrameAction类继承了AbstractAction类实现了Action接口。该类用于创建导航按钮的Action对象,并为每个导航按钮定义创建并显示不同窗体对象的动作监听器,这个监听器在被按钮被按下时,调用getIFrame()方法获取相应的窗体对象,并显示在主窗体中。 AbstractionAction.putValue()方法设置与指定键关联的 Value。

getIFrame()方法负责创建指定名称的窗体对象,在方法中使用了Java的反射技术,调用不同窗体类的默认构造方法创建窗体的对象。

反射就是把Java类中的各种成分映射成为相应的Java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成成分:成员变量,方法,构造方法,包等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速器等等也是一个个的类。表示Java类的Class类显然要提供一系列的方法,来获取其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,他们是Field、Method、Contructor、Package等等。Field类代表某个类中的一个成员变量;Method类代表某个类中的一个成员方法;Constructor类代表某个类中的一个构造方法。

公共模块设计

在本系统的项目空间中,有部分模块是公用的,或者是多个模块甚至整个系统的配置信息,他们被多个模块重复调用完成指定的业务逻辑,下面我们将分别介绍这些公共模块。

Dao公共类

protected static String dbClassName =\;

protected static String dbUrl =\; protected static String dbUser = \; protected static String dbPwd = \; protected static String second = null; public static Connection conn = null; static { }

try { }

if (conn == null) { }

ee.printStackTrace();

Class.forName(dbClassName).newInstance();

conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);

} catch (Exception ee) {

Dao公共类主要负责有关数据库的操作,该类在静态代码块中加载驱动并连接数据库,然后将所有的数据库访问方法定义为静态的。 ? ? ? ? ?

dbClassName:该成员变量用于定义数据库驱动类的名称。 dbUrl:该成员变量用于定义访问数据库的URL路径。 dbUser:该成员变量用于定义访问数据库的用户名。 dbPwd:该成员变量用于定义访问数据库的用户密码。 conn:该成员变量用于定义连接数据库的对象。

// 添加供应商信息的方法

public static boolean addGys(TbGysinfo gysInfo) { }

addGys()方法用于添加供应商的基础信息,它接受供应商的实体类TbGysinfo作方法的参数,然后把实体对象的所有属性存入供应商数据表中。

if (gysInfo == null)

return false;

+ gysInfo.getName() + \ + gysInfo.getJc() + \ + gysInfo.getAddress() + \ + gysInfo.getBianma() + \ + gysInfo.getTel() + \ + gysInfo.getFax() + \ + gysInfo.getLian() + \ + gysInfo.getLtel() + \ + gysInfo.getMail() + \ + gysInfo.getYh() + \);

return insert(\tb_gysinfo values('\ + gysInfo.getId() + \

public class TbGysinfo implements java.io.Serializable {

private String id; public TbGysinfo() {}

public TbGysinfo(String id) { this.id = id;

}

public String getId() { return this.id; }

public String getId() { return this.id; } }

供应商的基础信息包括id,name等,在这里我们仅以id为例。

为了外部用户能够访问某些私有变量,通常类的设计者会提供一些方法给外部调用,这些方法被称为访问接口。私有变量很好地贯彻了封装原则,所有的私有变量都只能通过程序员设计的接口来访问,任何外部使用者都无法直接访问它,所以有很高的安全性。但是通过接口访问私有变量,将降低程序的性能,这样就往往需要我们在安全性和效率间取得一个平衡。

程序中黄色衬底突出的部分:是一个无参构造方法和一个带参数的构造方法。Java规定,如果程序员一个构造方法都不定义,那么系统会自动为其加上一个不带参数的构造方法。如果程序员至少定义了一个构造方法,那么系统不会再提供不带参数的构造方法。强烈建议程序员在定义带参数的构造方法时,也要定义一个不带参数的构造方法,即便这个构造方法什么事情也不做,否则存在着很大的安全威胁。

程序中淡蓝色衬底突出的部分:类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

序列化简单的说就是为了保存在内存中的各种对象的状态(也就是变量,不是方法),并且可以把保存的对象状态再读出来。

需要进行序列化的情况:@1、当你想把内存中的对象写入到硬盘上的时候,或者把内存中的对象保存到数据库中的时候。比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;@2、当你想用套接字在网络上传送对象的时候;@3、当你想通过RMI传输对象的时候。

// 读取所有供应商信息

public static List getGysInfos() { }

List list = findForList(\); return list;

进货管理模块设计

本文来源:https://www.bwwdw.com/article/kl9t.html

Top