VVL1295

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Swing JTable

这里主要列出使用JTable时的应该注意的点:

1、默认不显示table的列名,要显示table的列名,应该把table放进Jscrollpane,并设置是否总是出现滚动条(水平方向以及垂直方向的);

2、要在JTable的单元格里加入组件,需要重写单元格的渲染器,重写渲染器的getTableCellRenderer(),方法返回的组件就是要加进去的组件;

3、单元格里面的组件需要触发事件,则要重写单元格的编辑器,按我的理解就是,先创建一个编辑器,继承一个abstractcellediotor和实现tablecelleiditor接口,然后再重写里面的getTableCellRenderer,跟重写渲染器很相似,不同的就是类名和方法名;然后再重写gettablecellrenderer返回的组件里组件以及其容纳的组件的addlistener方法,当然,还需要:

// 使被选中的行不能被编辑
table.setRowSelectionAllowed(false);

 以下贴出重写单元格渲染器和重写单元格编辑器的代码:

//创建单元格渲染器
class MyButtonRenderer implements TableCellRenderer {
	public JPanel panel;

	public JButton button1;
	public JButton button2;
	public JButton button3;

	public MyButtonRenderer() {
		initButton();

		initPanel();

		panel.add(button1);
		panel.add(button2);
		panel.add(button3);

	}

	private void initButton() {
		button1 = new JButton();
		button2 = new JButton();
		button3 = new JButton();

	}

	private void initPanel() {
		panel = new JPanel();

		panel.setLayout(new GridLayout(1, 3, 5, 5));
	}

	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {

		button1.setText("增加");
		button2.setText("删除");
		button3.setText("更新");

		return panel;
	}

}

// 创建单元格编辑器
class MyButtonEditor extends AbstractCellEditor implements TableCellEditor {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = -6546334664166791132L;

	public JPanel panel;

	public JButton button1 = new JButton();
	public JButton button2 = new JButton();
	public JButton button3 = new JButton();

	public MyButtonEditor() {

		initButton();

		initPanel();

	}

	public void initButton() {
		button1.setText("增加");
		button2.setText("删除");
		button3.setText("更新");

		button1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				button1.setText("被改变");

			}
		});
		button2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				button2.setText("被改变");

			}
		});
		button3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				button3.setText("被改变");

			}
		});

	}

	private void initPanel() {
		panel = new JPanel();

		panel.setLayout(new GridLayout(1, 3, 5, 5));

		panel.add(button1);
		panel.add(button2);
		panel.add(button3);
	}

	@Override
	public Component getTableCellEditorComponent(JTable table, Object value,
			boolean isSelected, int row, int column) {

		return panel;
	}

	@Override
	public Object getCellEditorValue() {
		return "按钮";
	}

}

 

4、要实现,单击单元格即可编辑,需要写上这样一段代码,代码如下:

table = new JTable(new DefaultTableModel(allData, columnNames)) {

			private static final long serialVersionUID = 1L;

			@Override
			public void changeSelection(int rowIndex, int columnIndex,
					boolean toggle, boolean extend) {
				super.changeSelection(rowIndex, columnIndex, toggle, extend);
				super.editCellAt(rowIndex, columnIndex, null);
			}
		};

 5、警告: DefaultTableModel 返回 Object 的一个列类。DefaultTableModelTableRowSorter 一起使用时将导致大量使用 toString,这对于非 String 数据类型代价昂贵。如果与 TableRowSorter 一起使用 DefaultTableModel,建议最好重写 getColumnClass 以返回适当的类型。

posted on 2015-08-25 11:42  bobo2018  阅读(314)  评论(0)    收藏  举报