Swing表格组件的实例

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); // 同时选中左侧固定列表格中的相应行
			}
		}
	}

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值