在学校做了一个小型的点菜系统,现在终于可以做一下总结。
总结一:对于多用户的系统,面向对象的编程思想是很重要的。可以将一种用户封装成一个类。
总结二:在编写程序时注意使用包,这样可以使代码在编写的时候更方便。
总结三:在调试程序时可以使用弹出对话框的形式显示自己需要看到的一些参数。
JOptionPane.showMessageDialog(getContentPane(), "请选择欲配送的消费项", "友情提示", JOptionPane.INFORMATION_MESSAGE);
接下来附上一些基本的类
package com.resturant.base;
//提供数据库的连接与释放服务
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBC {
//数据库连接的相关参数
private static final String DRIVERCLASS = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String URL = "jdbc:sqlserver://127.0.0.1:1368;databaseName=Restaurant";
private static final String USERNAME = "sheepc";
private static final String PASSWORD = "10425250c";
private static final ThreadLocal threadLocal = new ThreadLocal();
static {// 通过静态方法加载数据库驱动
try {
Class.forName(DRIVERCLASS).newInstance();// 加载数据库驱动
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {// 创建数据库连接的方法
Connection conn = threadLocal.get();// 从线程中获得数据库连接
if (conn == null) {// 没有可用的数据库连接
try {
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);// 创建新的数据库连接
threadLocal.set(conn);// 将数据库连接保存到线程中
} catch (SQLException e) {
e.printStackTrace();
}
}
return conn;
}
public static boolean closeConnection() {// 关闭数据库连接的方法
boolean isClosed = true;
Connection conn = threadLocal.get();// 从线程中获得数据库连接
threadLocal.set(null);// 清空线程中的数据库连接
if (conn != null) {// 数据库连接可用
try {
conn.close();// 关闭数据库连接
} catch (SQLException e) {
isClosed = false;
e.printStackTrace();
}
}
return isClosed;
}
}
//各种操作的集合
package com.resturant.base;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
public class Operation{
private static Operation op;
static {
op = new Operation();
}
public static Operation getInstance() {
return op;
}
// 查询多个记录,返回一个列表(不包含属性名,只含数据)
public Vector> selectSomeNote(String sql) {
Vector> vector = new Vector>();// 创建结果集向量
Connection conn = JDBC.getConnection();// 获得数据库连接
try {
Statement stmt = conn.createStatement();// 创建连接状态对象
ResultSet rs = stmt.executeQuery(sql);// 执行SQL语句获得查询结果
int columnCount = rs.getMetaData().getColumnCount();// 获得查询数据表的列数
int row = 1;// 定义行序号
if(columnCount == 0)
{
vector = null;
return vector;
}
while (rs.next()) {// 遍历结果集
Vector
package com.resturant.mwing;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
public class MTable extends JTable {
/**
*
*/
private static final long serialVersionUID = 7739039874491753652L;
public MTable() {
super();
}
public MTable(DefaultTableModel tableModel) {
super(tableModel);
}
// 表格列值居中显示
@Override
public TableCellRenderer getDefaultRenderer(Class> columnClass) {
// 获得除表格头部分的单元格对象
DefaultTableCellRenderer tableRenderer = (DefaultTableCellRenderer) super.getDefaultRenderer(columnClass);
// 设置单元格内容居中显示
tableRenderer.setHorizontalAlignment(SwingConstants.CENTER);
return tableRenderer;
}
// 表格列名信息
@Override
public JTableHeader getTableHeader() {
// 获得表格头对象
JTableHeader tableHeader = super.getTableHeader();
tableHeader.setReorderingAllowed(false);// 设置表格列不可重排
// 获得表格头的单元格对象
DefaultTableCellRenderer headerRenderer = (DefaultTableCellRenderer) tableHeader.getDefaultRenderer();
// 设置单元格内容(即列名)居中显示
headerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
return tableHeader;
}
// 表格不可编辑
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
// 用来设置表格的选中行
@Override
public void setRowSelectionInterval(int fromRow, int toRow) {// 重构父类的方法
super.setRowSelectionInterval(fromRow, toRow);
}
// 用来设置表格的唯一选中行
public void setRowSelectionInterval(int row) {// 通过重载实现自己的方法
setRowSelectionInterval(row, row);
}
// 表格行只可单选
@Override
public ListSelectionModel getSelectionModel() {
ListSelectionModel selectionModel = super.getSelectionModel();
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
return selectionModel;
}
}
package com.resturant.mwing;
import java.awt.Insets;
import javax.swing.JButton;
public class MButton extends JButton {
/**
*
*/
private static final long serialVersionUID = 5677833057913201022L;
public MButton() {
setContentAreaFilled(false);
setMargin(new Insets(0, 0, 0, 0));
setBorderPainted(false);
setFocusPainted(false);
}
}
package com.resturant.mwing;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class MPanel extends JPanel {
/**
带图片的面板
*/
private static final long serialVersionUID = 7056298952360607443L;
private ImageIcon imageIcon;// 声明一个图片对象
public MPanel(URL imgUrl) {
super();// 继承父类的构造方法
setLayout(new GridBagLayout());// 将布局管理器修改为网格组布局
imageIcon = new ImageIcon(imgUrl);// 根据传入的URL创建ImageIcon对象
setSize(imageIcon.getIconWidth(), imageIcon.getIconHeight());// 设置面板与图片等大
}
@Override
protected void paintComponent(Graphics g) {// 重写JPanel类的paintComponent()方法
super.paintComponent(g);// 调用JPanel类的paintComponent()方法
Image image = imageIcon.getImage();// 通过ImageIcon对象获得Image对象
g.drawImage(image, 0, 0, null);// 绘制Image对象,即将图片绘制到面板中
}
}
对于表格的使用样例,先声明列名向量,再设置表格模式,最后设置表格。
private JTable menuTable;
private final Vector menuColumnNameV = new Vector();
private final DefaultTableModel menuModel = new DefaultTableModel();
String columnNames[] = new String[] {"序号", "编号", "菜名", "菜系", "菜类", "单价", "单位"};
for (int i = 0; i < columnNames.length; i++) {
menuColumnNameV.add(columnNames[i]);
}
menuModel.setDataVector(op.selectSomeNote("SELECT [MENU].id,[MENU].name,[CUISINE].name,[DISH_CATEGORY].name,price,unit FROM MENU,CUISINE,DISH_CATEGORY WHERE [MENU].cuisine_id = [CUISINE].id AND [MENU].category_id = [DISH_CATEGORY].id"), menuColumnNameV);
menuTable = new MTable(menuModel);
if (menuTable.getRowCount() > 0)
menuTable.setRowSelectionInterval(0, 0);
menuScrollPane.setViewportView(menuTable);