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;
进货管理模块设计
正在阅读:
JAVA进销存管理系统攻坚笔记一11-23
如何用亚麻籽油做出各种各样的美食06-11
今日基督徒普遍的可怜的光景01-26
认识脚气与脚湿气的区别06-20
房地产项目核心卖点梳理11-27
自考供应链物流学试卷第七套11-19
爸爸的作文600字五篇03-27
中国人民解放军各集团军编制战斗序列大全05-02
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 攻坚
- 进销存
- 管理系统
- 笔记
- JAVA
- 2015年下半年辽宁省城市规划师考试城市规划实务:工程管线综合布置原则考试试卷
- 模电答案
- 廉政学习心得体会
- 九年级语文下册《祖国啊,我亲爱的中国》学案及答案
- 《有机化学》练习题(大学)(一)芳烃
- 化工工程设计与分析 复习题
- 期货基础知识考试样卷
- 分析化学试卷及答案A
- Java GUI实验报告
- 现代汉语第一次作业
- pcb是什么?进程控制块PCB
- 盾构机维修方案 - 图文
- 管理学原理-课程学习综合练习(复习)题集
- 流行病学大题总结
- 影响试管婴儿成功率的因素
- 第十八届华杯赛初赛小高组C卷试题及详解
- 2015年浙江省普通高考考试说明语文参考试卷
- 数值分析最佳试题
- 2018年中国汽车涂料发展现状与市场前景分析(目录) - 图文
- 化工原理习题解第二章流体输送机械