JTable 是swing 包中提供显示二维表的控件,一般被包裹在一个JScrollPanel 里面显示数据。
DefaultTableModel 是 TableModel
的一个实现,用来操作JTable 的数据和一些属性。
譬如 修改数据时候获取到JTable 的TableModel 进行数据的删除、增加、修改,完成之后调用JTable 的invalidate 方法来更新布局,显示数据。
下面这段代码使用TableModel 实现JTable中第一列可以编辑,其他不可以编辑,其他一些设置也可以在此中重写代码实现自己需要的功能。
DefaultTableModel defaultmodel=new DefaultTableModel(0, 4){ @Override public boolean isCellEditable(int row, int column) { if(column==0){ return true; }else{ return false; } } }; searchedGrid =new JTable(defaultmodel) ;
新建好JTable之后我们就可以对它的一些列做一些设置,如下
TableColumnModel columnModel = searchedGrid.getColumnModel(); TableColumn column0 = columnModel.getColumn(0);//设置第一列 column0.setHeaderValue(""); column0.setMaxWidth(30); column0.setMinWidth(30); column0.setResizable(false); column0.setCellRenderer(new JCheckBoxRender());//设置渲染效果 column0.setCellEditor(new DefaultCellEditor(new JCheckBoxRender()));//设置编辑效果, 这里最好和Renderer是相同,负责会出现一点怪毛病
JCheckBoxRender.java
public class JCheckBoxRender extends JCheckBox implements TableCellRenderer { private static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); public JCheckBoxRender() { super(); setHorizontalAlignment(SwingConstants.CENTER); setBorderPainted(true); } @Override public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected, final boolean hasFocus, final int row, final int column) { setBackground(table.getBackground()); if (hasFocus) { setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); } else { setBorder(noFocusBorder); } if(column==0){ if(value instanceof Boolean){ setSelected((Boolean)value); } } return this; } }
当然我们也可以如下做出隔行颜色不一样的Table。
searchedGrid.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { setBackground(row%2==0?Color.red:Color.green); return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); } });
此外,在各位仁兄在删除数据时候,尽量从后往前删除,避免错误(这个问题是由于不管是Vector还是List 删除元素是index会发生变化,导致索引失效,一般采用一直删除第一个或者反向删除)