酒店管理系统之日结帐界面(swing)


package com.mwq.frame.check_out;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumnModel;

import com.mwq.dao.Dao;
import com.mwq.mwing.FixedColumnTablePanel;
import com.mwq.mwing.MTable;
import com.mwq.tool.Today;

public class DayDialog extends JDialog {

// private JTable table;
//
// private DefaultTableModel tableModel;

private Vector<String> tableColumnV;

private Vector<Vector<Object>> tableValueV;

private JComboBox dayComboBox;

private JComboBox monthComboBox;

private JComboBox yearComboBox;

private int daysOfMonth[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
30, 31 };

private Dao dao=Dao.getInstance();

/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
try {
DayDialog dialog = new DayDialog();
dialog.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Create the dialog
*/
public DayDialog() {
super();
setModal(true);
setTitle("日结账");
setBounds(60, 60, 860, 620);

final JPanel panel = new JPanel();
getContentPane().add(panel, BorderLayout.NORTH);

int year = Today.getYEAR();
int month = Today.getMONTH();
int day = Today.getDAY();

yearComboBox = new JComboBox();
yearComboBox.setMaximumRowCount(10);
String minDatetime = dao.sOrderFormOfMinDatetime();
if (minDatetime == null) {
yearComboBox.addItem(year);
} else {
int minYear = Integer.valueOf(minDatetime.substring(0, 4));
for (int y = minYear; y <= year; y++) {
yearComboBox.addItem(y);
}
}
yearComboBox.setSelectedItem(year);
judgeLeapYear(year);
yearComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int year = (Integer) yearComboBox.getSelectedItem();// 获得选中的年度
judgeLeapYear(year);// 判断是否为闰年,以确定2月份的天数
int month = (Integer) monthComboBox.getSelectedItem();// 获得选中的月份
if (month == 2) {// 如果选中的为2月
int itemCount = dayComboBox.getItemCount();// 获得日下拉菜单当前的天数
if (itemCount != daysOfMonth[2]) {// 如果日下拉菜单当前的天数不等于2月份的天数
if (itemCount == 28)// 如果日下拉菜单当前的天数为28天
dayComboBox.addItem(29);// 则添加为29天
else
// 否则日下拉菜单当前的天数则为29天
dayComboBox.removeItem(29);// 则减少为28天
}
}
}
});
panel.add(yearComboBox);

final JLabel yearLabel = new JLabel();
yearLabel.setText("年");
panel.add(yearLabel);

monthComboBox = new JComboBox();
monthComboBox.setMaximumRowCount(12);
for (int m = 1; m < 13; m++) {
monthComboBox.addItem(m);
}
monthComboBox.setSelectedItem(month);
monthComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int month = (Integer) monthComboBox.getSelectedItem();// 获得选中的月份
int itemCount = dayComboBox.getItemCount();// 获得日下拉菜单当前的天数
while (itemCount != daysOfMonth[month]) {// 如果日下拉菜单当前的天数不等于选中月份的天数
if (itemCount > daysOfMonth[month]) {// 如果大于选中月份的天数
dayComboBox.removeItem(itemCount);// 则移除最后一个选择项
itemCount--;// 并将日下拉菜单当前的天数减1
} else {// 否则小于选中月份的天数
itemCount++;// 将日下拉菜单当前的天数加1
dayComboBox.addItem(itemCount);// 并添加为选择项
}
}
}
});
panel.add(monthComboBox);

final JLabel monthLabel = new JLabel();
monthLabel.setText("月");
panel.add(monthLabel);

dayComboBox = new JComboBox();
dayComboBox.setMaximumRowCount(10);
int days = daysOfMonth[month];
for (int d = 1; d <= days; d++) {
dayComboBox.addItem(d);
}
dayComboBox.setSelectedItem(day);
panel.add(dayComboBox);

final JLabel dayLabel = new JLabel();
dayLabel.setText("日 ");
panel.add(dayLabel);

final JButton submitButton = new JButton();
submitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tableValueV.removeAllElements();
int year = (Integer) yearComboBox.getSelectedItem();
int month = (Integer) monthComboBox.getSelectedItem();
int day = (Integer) dayComboBox.getSelectedItem();
int columnCount = tableColumnV.size();
Vector orderFormV = dao.sOrderFormOfDay(year + "-" + month
+ "-" + day);
for (int row = 0; row < orderFormV.size(); row++) {
Vector rowV = new Vector();// 表格行对象
Vector orderForm = (Vector) orderFormV.get(row);// 消费单对象
String orderFormNum = orderForm.get(1).toString();
rowV.add(orderFormNum);// 编号
rowV.add(orderForm.get(2));// 台号
rowV.add(orderForm.get(3).toString().substring(11, 19));// 开台时间
rowV.add(orderForm.get(4));// 消费金额
for (int column = 4; column < columnCount; column++) {
rowV.add("——");// 商品消费数量,默认未消费
}
Vector orderItemV = dao
.sOrderItemAndMenuByOrderFormNum(orderFormNum);
for (int i = 0; i < orderItemV.size(); i++) {
Vector orderItem = (Vector) orderItemV.get(i);// 消费项目对象
String menuName = orderItem.get(3).toString();
for (int column = 4; column < columnCount; column++) {
if (tableColumnV.get(column).equals(menuName)) {
int amount = (Integer) orderItem.get(4);
if (rowV.get(column).toString().equals("——"))
rowV.set(column, amount);
else
rowV.set(column, (Integer) rowV.get(column)
+ amount);
break;
}
}
}
tableValueV.add(rowV);
}
Vector totalV = new Vector();
totalV.add("总计");
totalV.add("——");
totalV.add("——");
int rowCount = tableValueV.size();
for (int column = 3; column < columnCount; column++) {
int total = 0;
for (int row = 0; row < rowCount; row++) {
Object value = tableValueV.get(row).get(column);
if (!value.equals("——"))
total += (Integer) value;
}
totalV.add(total);
}
tableValueV.add(totalV);
Container contentPane = getContentPane();
contentPane.remove(1);
contentPane.add(new FixedColumnTablePanel(tableColumnV,
tableValueV, 4), BorderLayout.CENTER);
SwingUtilities.updateComponentTreeUI(contentPane);
}
});
submitButton.setText("确定");
panel.add(submitButton);

tableColumnV = new Vector<String>();
tableColumnV.add("编号");
tableColumnV.add("台号");
tableColumnV.add("开台时间");
tableColumnV.add("消费金额");
Vector<Vector<Object>> vector = dao.sMenu();
for (int i = 0; i < vector.size(); i++) {
tableColumnV.add(vector.get(i).get(2).toString());
}

tableValueV = new Vector();

getContentPane().add(
new FixedColumnTablePanel(tableColumnV, tableValueV, 4),
BorderLayout.CENTER);
//
}

private void judgeLeapYear(int year) {
if (year % 100 == 0) {
if (year % 400 == 0)
daysOfMonth[2] = 29;
else
daysOfMonth[2] = 28;
} else {
if (year % 4 == 0)
daysOfMonth[2] = 29;
else
daysOfMonth[2] = 28;
}
}

}



上面代码得出如下图:

[img]http://dl.iteye.com/upload/attachment/472709/633b53c0-ef45-33a9-b7b6-da793e13aa98.jpg[/img]

上面代码的217-218行:
contentPane.add(new FixedColumnTablePanel(tableColumnV,
tableValueV, 4), BorderLayout.CENTER);
还用下面代码到:

package com.mwq.mwing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.util.Vector;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;

public class FixedColumnTablePanel extends JPanel {

private MTable fixedColumnTable;

private FixedColumnTableModel fixedColumnTableModel;

private MTable floatingColumnTable;

private FloatingColumnTableModel floatingColumnTableModel;

private Vector<String> tableColumnV;

private Vector<Vector<Object>> tableValueV;

private int fixedColumn = 2;

public FixedColumnTablePanel(Vector<String> tableColumnV,
Vector<Vector<Object>> tableValueV, int fixedColumn) {
super();
setLayout(new BorderLayout());

this.tableColumnV = tableColumnV;
this.tableValueV = tableValueV;
this.fixedColumn = fixedColumn;

fixedColumnTableModel = new FixedColumnTableModel();// 创建固定列表格模型对象

fixedColumnTable = new MTable(fixedColumnTableModel);// 创建固定列表格对象
ListSelectionModel fixed = fixedColumnTable.getSelectionModel();// 获得选择模型对象
fixed.addListSelectionListener(new MListSelectionListener(true));// 添加行被选中的事件监听器

floatingColumnTableModel = new FloatingColumnTableModel();// 创建可移动列表格模型对象

floatingColumnTable = new MTable(floatingColumnTableModel);// 创建可移动列表格对象
ListSelectionModel floating = floatingColumnTable.getSelectionModel();// 获得选择模型对象
floating.addListSelectionListener(new MListSelectionListener(false));// 添加行被选中的事件监听器

JScrollPane scrollPane = new JScrollPane();// 创建一个滚动面版对象
scrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedColumnTable
.getTableHeader()); // 将固定列表格头放到滚动面版的左上方

JViewport viewport = new JViewport();// 创建一个用来显示基础信息的视口对象
viewport.setView(fixedColumnTable);// 将固定列表格添加到视口中
viewport.setPreferredSize(fixedColumnTable.getPreferredSize());// 设置视口的首选大小为固定列表格的首选大小
scrollPane.setRowHeaderView(viewport);// 将视口添加到滚动面版的标题视口中

scrollPane.setViewportView(floatingColumnTable);// 将可移动表格添加到默认视口

add(scrollPane, BorderLayout.CENTER);
//
}

class MTable extends JTable {

public MTable(AbstractTableModel tableModel) {
super(tableModel);
setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
}

// 表格列名信息
@Override
public JTableHeader getTableHeader() {
// 获得表格头对象
JTableHeader tableHeader = super.getTableHeader();
tableHeader.setReorderingAllowed(false);// 设置表格列不可重排
// 获得表格头的单元格对象
DefaultTableCellRenderer defaultRenderer = (DefaultTableCellRenderer) tableHeader
.getDefaultRenderer();
// 设置单元格内容(即列名)居中显示
defaultRenderer
.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return tableHeader;
}

// 表格列值居中显示
@Override
public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
DefaultTableCellRenderer defaultRenderer = (DefaultTableCellRenderer) super
.getDefaultRenderer(columnClass);
defaultRenderer
.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return defaultRenderer;
}

// 表格行只可单选
@Override
public ListSelectionModel getSelectionModel() {
ListSelectionModel selectionModel = super.getSelectionModel();
selectionModel
.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
return selectionModel;
}

// 用来设置表格的选中行
@Override
public void setRowSelectionInterval(int fromRow, int toRow) {// 重构父类的方法
super.setRowSelectionInterval(fromRow, toRow);
}

// 用来设置表格的唯一选中行
public void setRowSelectionInterval(int row) {// 通过重载实现自己的方法
setRowSelectionInterval(row, row);
}

}

class FixedColumnTableModel extends AbstractTableModel {

public int getColumnCount() {// 返回固定列的数量
return fixedColumn;
}

public int getRowCount() {// 返回行数
return tableValueV.size();
}

public Object getValueAt(int rowIndex, int columnIndex) {// 返回指定单元格的值
return tableValueV.get(rowIndex).get(columnIndex);
}

@Override
public String getColumnName(int columnIndex) {// 返回指定列的名称
return tableColumnV.get(columnIndex);
}

}

class FloatingColumnTableModel extends AbstractTableModel {

public int getColumnCount() {// 返回可移动列的数量
return tableColumnV.size() - fixedColumn;// 需要扣除固定列的数量
}

public int getRowCount() {// 返回行数
return tableValueV.size();
}

public Object getValueAt(int rowIndex, int columnIndex) {// 返回指定单元格的值
return tableValueV.get(rowIndex).get(columnIndex + fixedColumn);// 需要为列索引加上固定列的数量
}

@Override
public String getColumnName(int columnIndex) {// 返回指定列的名称
return tableColumnV.get(columnIndex + fixedColumn);// 需要为列索引加上固定列的数量
}

}

class MListSelectionListener implements ListSelectionListener {
boolean isFixedColumnTable = true; // 默认由选中固定列表格中的行触发

public MListSelectionListener(boolean isFixedColumnTable) {
this.isFixedColumnTable = isFixedColumnTable;
}

public void valueChanged(ListSelectionEvent e) {
if (isFixedColumnTable) { // 由选中固定列表格中的行触发
int selectedRow = fixedColumnTable.getSelectedRow(); // 获得固定列表格中的选中行
floatingColumnTable.setRowSelectionInterval(selectedRow); // 同时选中可移动列表格中的选中行
} else { // 由选中可移动列表格中的行触发
int selectedRow = floatingColumnTable.getSelectedRow(); // 获得可移动列表格中的选中行
fixedColumnTable.setRowSelectionInterval(selectedRow); // 同时选中固定列表格中的选中行
}
}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值