点击按钮为JTable动态新增Boolean类型列的实现咨询
问题根因
原有代码不生效是两个逻辑错误导致的:
- 匿名TableModel内部定义的
columnTypes是长度固定为2的数组,新增列后数组长度无法匹配列数,调用getColumnClass访问新列索引时会直接抛出数组越界异常 columnTypes是匿名TableModel子类的私有成员,按钮事件监听器里无法直接访问这个内部变量,你写的columnTypes[i] = Boolean.class操作的是外部类的同名变量,TableModel完全读取不到这个设置,自然不会将新列识别为Boolean类型。
实现方法
放弃固定长度的数组存储列类型,改用支持动态扩容的ArrayList维护列与类型的映射关系,将新增列、追加类型的逻辑封装在TableModel内部,新增列时同步追加Boolean类型即可,修正后的可运行代码如下:
scrollPane.setViewportView(mainTable); mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); mainTable.setColumnSelectionAllowed(true); // 初始化自定义表格模型 DefaultTableModel tableModel = new DefaultTableModel( new Object[][] { {null, null}, }, new String[] { "Name", "New column" } ) { // 用动态集合替代固定长度数组存储列类型 private final List<Class<?>> columnTypes = new ArrayList<>(List.of( String.class, Boolean.class )); @Override public Class<?> getColumnClass(int columnIndex) { return columnTypes.get(columnIndex); } // 封装新增Boolean列的方法,新增列时同步维护类型映射 public void addBooleanColumn(String columnName) { addColumn(columnName); columnTypes.add(Boolean.class); } }; mainTable.setModel(tableModel); mainPanel.add(addStuBTN); JButton addDayBTN = new JButton("Add Day"); addDayBTN.setBounds(10, 387, 113, 23); // 列计数器初始值为2,因为初始化时已经存在2列 int dayCount = 2; addDayBTN.addActionListener(e -> { tableModel.addBooleanColumn("Day " + dayCount); dayCount++; }); mainPanel.add(addDayBTN);
补充说明:JTable默认会根据
getColumnClass返回的类型选择对应的渲染器、编辑器,只要对应列返回Boolean.class,就会自动渲染为复选框样式,不需要额外自定义单元格渲染器。
内容的提问来源于stack exchange,提问作者fadolfo
相关产品推荐
相关产品推荐

