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 的一个列类。DefaultTableModel 与 TableRowSorter 一起使用时将导致大量使用 toString,这对于非 String 数据类型代价昂贵。如果与 TableRowSorter 一起使用 DefaultTableModel,建议最好重写 getColumnClass 以返回适当的类型。
浙公网安备 33010602011771号