1.利用Swing表格设计一个用来选择日期的对话框。
import java.awt.*;
import javax.swing.*;
public class Answer_2108 extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* Launch the application
*
* @param args
*/
public static void main(String args[]) {
try {
Answer_2108 frame = new Answer_2108();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Create the frame
*/
public Answer_2108() {
super();
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel topPanel = new JPanel();
getContentPane().add(topPanel, BorderLayout.NORTH);
final JLabel topLabel = new JLabel();
topLabel.setText("日期:");
topPanel.add(topLabel);
final MDateField topTreeComboBox = new MDateField();
topPanel.add(topTreeComboBox);
final JPanel bottomPanel = new JPanel();
getContentPane().add(bottomPanel, BorderLayout.SOUTH);
final JLabel bottomLabel = new JLabel();
bottomLabel.setText("日期:");
bottomPanel.add(bottomLabel);
final MDateField bottomTreeComboBox = new MDateField();
bottomPanel.add(bottomTreeComboBox);
final JLabel label = new JLabel();
label.setText("");
getContentPane().add(label, BorderLayout.CENTER);
//
}
}
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
public class MDateField extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private JTextField textField;
public MDateField() {
super();
final FlowLayout flowLayout = new FlowLayout();
flowLayout.setHgap(0);
setLayout(flowLayout);
textField = new JTextField();
textField.setColumns(12);
add(textField);
final JButton button = new JButton();
button.setText("...");
button.setMargin(new Insets(0, 4, 0, 4));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Dimension preferredSize = textField.getPreferredSize();
Point locationOnScreen = textField.getLocationOnScreen();
int x = (int) locationOnScreen.getX();
int y = (int) (locationOnScreen.getY() + preferredSize
.getHeight());
int width = 310;
int height = 187;
JRootPane rootPane = textField.getRootPane();
Point rootPaneLocationOnScreen = rootPane.getLocationOnScreen();
if (height > rootPaneLocationOnScreen.getY()
+ rootPane.getHeight() - y) {
y = (int) (locationOnScreen.getY() - height);
}
ChooseDateDialog dialog = new ChooseDateDialog();
dialog.setBounds(x, y, width, height);
dialog.setVisible(true);
}
});
add(button);
//
}
class ChooseDateDialog extends JDialog {
/**
*
*/
private static final long serialVersionUID = 1L;
private int year;
private int month;
private int day;
private int[] daysOfMonth = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30,
31, 30, 31 };
private JTextField yTextField;
private JTextField mTextField;
private DefaultTableModel tableModel;
public ChooseDateDialog() {
super();
setModal(true);
setUndecorated(true);
setBounds(100, 100, 310, 153);
Calendar today = Calendar.getInstance();
year = today.get(Calendar.YEAR);
month = today.get(Calendar.MONTH) + 1;
day = today.get(Calendar.DAY_OF_MONTH);
if (year % 4 == 0) {
if (year % 100 != 0 || year % 400 == 0)
daysOfMonth[2] = 29;
else
daysOfMonth[2] = 28;
} else {
daysOfMonth[2] = 28;
}
final JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBorder(new LineBorder(Color.black, 1, false));
getContentPane().add(panel, BorderLayout.CENTER);
final JPanel buttonPanel = new JPanel();
panel.add(buttonPanel, BorderLayout.NORTH);
final JButton pyButton = new JButton();
pyButton.setText("<<");
pyButton.setToolTipText("上一年");
pyButton.setMargin(new Insets(0, 10, 0, 10));
pyButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
yTextField.setText(--year + "");
initTableModel();
}
});
buttonPanel.add(pyButton);
final JButton pmButton = new JButton();
pmButton.setText("<");
pmButton.setToolTipText("上一月");
pmButton.setMargin(new Insets(0, 12, 0, 12));
pmButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
month--;
if (month < 1) {
month = 12;
yTextField.setText(--year + "");
}
mTextField.setText(month + "");
initTableModel();
}
});
buttonPanel.add(pmButton);
yTextField = new JTextField();
yTextField.setColumns(4);
yTextField.setEditable(false);
yTextField.setHorizontalAlignment(JTextField.CENTER);
yTextField.setText(year + "");
buttonPanel.add(yTextField);
final JLabel yLabel = new JLabel();
yLabel.setText("年");
buttonPanel.add(yLabel);
mTextField = new JTextField();
mTextField.setColumns(2);
mTextField.setEditable(false);
mTextField.setHorizontalAlignment(JTextField.CENTER);
mTextField.setText(month + "");
buttonPanel.add(mTextField);
final JLabel mLabel = new JLabel();
mLabel.setText("月");
buttonPanel.add(mLabel);
final JButton nmButton = new JButton();
nmButton.setText(">");
nmButton.setToolTipText("下一月");
nmButton.setMargin(new Insets(0, 12, 0, 12));
nmButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
month++;
if (month > 12) {
month = 1;
yTextField.setText(++year + "");
}
mTextField.setText(month + "");
initTableModel();
}
});
buttonPanel.add(nmButton);
final JButton nyButton = new JButton();
nyButton.setText(">>");
nyButton.setToolTipText("下一年");
nyButton.setMargin(new Insets(0, 12, 0, 12));
nyButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
yTextField.setText(++year + "");
initTableModel();
}
});
buttonPanel.add(nyButton);
final JScrollPane scrollPane = new JScrollPane();
panel.add(scrollPane, BorderLayout.CENTER);
tableModel = new DefaultTableModel(6, 7);
String[] columnNames = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五",
"星期六" };
tableModel.setColumnIdentifiers(columnNames);
initTableModel();
final JTable table = new MTable(tableModel);
table.setRowSelectionAllowed(false);
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
String dayS = table.getValueAt(table.getSelectedRow(),
table.getSelectedColumn()).toString();
if (!dayS.startsWith("[")) {
day = Integer.valueOf(dayS);
textField.setText(getSelectedDate());
dispose();
}
}
});
scrollPane.setViewportView(table);
final JLabel label = new JLabel();
label.setText(" ");
panel.add(label, BorderLayout.WEST);
final JLabel label_1 = new JLabel();
label_1.setText(" ");
panel.add(label_1, BorderLayout.EAST);
final JPanel todayPanel = new JPanel();
panel.add(todayPanel, BorderLayout.SOUTH);
final JLabel label_2 = new JLabel();
label_2.setText("今天:" + year + "-" + month + "-" + day + " ");
todayPanel.add(label_2);
final JButton button = new JButton();
button.setText("...");
button.setMargin(new Insets(0, 12, 0, 12));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Calendar today = Calendar.getInstance();
year = today.get(Calendar.YEAR);
month = today.get(Calendar.MONTH) + 1;
day = today.get(Calendar.DAY_OF_MONTH);
if (year % 4 == 0) {
if (year % 100 != 0 || year % 400 == 0)
daysOfMonth[2] = 29;
else
daysOfMonth[2] = 28;
} else {
daysOfMonth[2] = 28;
}
yTextField.setText(year + "");
mTextField.setText(month + "");
initTableModel();
}
});
todayPanel.add(button);
}
private void initTableModel() {
DateFormat dateFormat = DateFormat.getDateInstance();
try {
dateFormat.parse(year + "-" + month + "-" + 1);
} catch (ParseException e) {
e.printStackTrace();
}
Calendar theDay = dateFormat.getCalendar();
int dayOfWeek = theDay.get(Calendar.DAY_OF_WEEK);
for (int col = 0; col < dayOfWeek - 1; col++) {
int days = ((month - 1) < 1 ? 31 : daysOfMonth[month - 1]);
int day = days - ((dayOfWeek - 1) - 1 - col);
tableModel.setValueAt("[ " + day + " ]", 0, col);
}
int day = 1;
for (int col = dayOfWeek - 1; col < 7; col++) {
tableModel.setValueAt(day++, 0, col);
}
String s = "";
String e = "";
for (int row = 1; row < 6; row++) {
for (int col = 0; col < 7; col++) {
if (day > daysOfMonth[month]) {
s = "[ ";
e = " ]";
day = 1;
}
tableModel.setValueAt(s + day++ + e, row, col);
}
}
}
public String getSelectedDate() {
return year + "-" + month + "-" + day;
}
}
class MTable extends JTable {
/**
*
*/
private static final long serialVersionUID = 1L;
public MTable() {
super();
}
public MTable(DefaultTableModel tableModel) {
super(tableModel);
}
// 表格列名信息
@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 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);
}
}
}
2.设计一个以多列为行标题栏的例子。
import java.awt.*;
import java.util.*;
import javax.swing.*;
public class Answer_2109 extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
public static void main(String args[]) {
try {
Answer_2109 frame = new Answer_2109();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public Answer_2109() {
super();
setTitle("提供行标题栏的表格");
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Vector<String> columnNameV = new Vector<>();
columnNameV.add("日期");
columnNameV.add("营业额");// 添加一个日营业额列
for (int i = 1; i < 21; i++) {
columnNameV.add("商品" + i);
}
Vector<Vector<Object>> tableValueV = new Vector<>();
for (int row = 1; row < 31; row++) {
Vector<Object> rowV = new Vector<>();
rowV.add(row);
int sum = 0;// 日营业额
for (int col = 0; col < 20; col++) {
int value = (int) (Math.random() * 1000);
rowV.add(value);
sum += value;// 累计日营业额
}
rowV.insertElementAt(sum, 1);// 插入日营业额数据
tableValueV.add(rowV);
}
final MFixedColumnTable panel = new MFixedColumnTable(columnNameV,
tableValueV, 2);// 修改固定列数量
getContentPane().add(panel, BorderLayout.CENTER);
//
}
}
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class MFixedColumnTable extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private JTable fixedColumnTable;// 固定列表格对象
private FixedColumnTableModel fixedColumnTableModel;// 固定列表格模型对象
private JTable floatingColumnTable;// 移动列表格对象
private FloatingColumnTableModel floatingColumnTableModel;// 移动列表格模型对象
private Vector<String> columnNameV;// 表格列名数组
private Vector<Vector<Object>> tableValueV;// 表格数据数组
private int fixedColumn = 1;// 固定列数量
public MFixedColumnTable(Vector<String> columnNameV,
Vector<Vector<Object>> tableValueV, int fixedColumn) {
super();
setLayout(new BorderLayout());
this.columnNameV = columnNameV;
this.tableValueV = tableValueV;
this.fixedColumn = fixedColumn;
fixedColumnTableModel = new FixedColumnTableModel();// 创建固定列表格模型对象
fixedColumnTable = new JTable(fixedColumnTableModel);// 创建固定列表格对象
ListSelectionModel fixed = fixedColumnTable.getSelectionModel();// 获得选择模型对象
fixed.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 选择模式为单选
fixed.addListSelectionListener(new MListSelectionListener(true));// 添加行被选中的事件监听器
floatingColumnTableModel = new FloatingColumnTableModel();// 创建可移动列表格模型对象
floatingColumnTable = new JTable(floatingColumnTableModel);// 创建可移动列表格对象
floatingColumnTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);// 关闭表格的自动调整功能
ListSelectionModel floating = floatingColumnTable.getSelectionModel();// 获得选择模型对象
floating.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 选择模式为单选
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);
//
}
private class FixedColumnTableModel extends AbstractTableModel {
/**
*
*/
private static final long serialVersionUID = 1L;
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 columnNameV.get(columnIndex);
}
}
private class FloatingColumnTableModel extends AbstractTableModel {
/**
*
*/
private static final long serialVersionUID = 1L;
public int getColumnCount() {// 返回可移动列的数量
return columnNameV.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 columnNameV.get(columnIndex + fixedColumn);// 需要为列索引加上固定列的数量
}
}
private class MListSelectionListener implements ListSelectionListener {
boolean isFixedColumnTable = true; // 默认由选中固定列表格中的行触发
public MListSelectionListener(boolean isFixedColumnTable) {
this.isFixedColumnTable = isFixedColumnTable;
}
public void valueChanged(ListSelectionEvent e) {
if (isFixedColumnTable) { // 由选中固定列表格中的行触发
int row = fixedColumnTable.getSelectedRow(); // 获得固定列表格中的选中行
floatingColumnTable.setRowSelectionInterval(row, row); // 同时选中右侧可移动列表格中的相应行
} else { // 由选中可移动列表格中的行触发
int row = floatingColumnTable.getSelectedRow(); // 获得可移动列表格中的选中行
fixedColumnTable.setRowSelectionInterval(row, row); // 同时选中左侧固定列表格中的相应行
}
}
}
}