Доброе время суток. Реализую форму с таблицей, столбцами которой являются 2 комбобокса и кнопка удаления строки. Всё работает отлично, но если добавить несколько строк, после чего удалить последнюю, а потом любую другую, то получается exception в глубине JTable. В чём проблема? Реализовал так: Код | public class OurSettings extends JFrame { public OurSettings(){ super("Настройки"); setBounds(100, 100, 400, 400); getContentPane().setLayout(new BorderLayout());
final JTable table = new JTable(); table.setRowHeight(20); JScrollPane scrollPane = new JScrollPane(table); getContentPane().add(scrollPane, BorderLayout.CENTER);
JPanel butPanel = new JPanel(); JButton btnAdd = new JButton("Добавить"); JButton btnOk = new JButton("Ок"); butPanel.add(btnAdd); butPanel.add(btnOk); getContentPane().add(butPanel, BorderLayout.SOUTH);
btnAdd.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ((DefaultTableModel)table.getModel()).addRow(new Object[]{"объект", "кто", "Удалить"}); } });
btnOk.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { OurSettings.this.setVisible(false); } });
DefaultTableModel model = (DefaultTableModel)table.getModel();
// Add some columns model.addColumn("Тип", new Object[]{"объект"}); model.addColumn("Признак", new Object[]{"кто"}); model.addColumn("Удалить", new Object[]{"Удалить"});
// These are the combobox values String[] types = new String[]{"объект", "агент", "место", "тема"};
String[] features = new String[]{"кто", "что", "где"};
// Set the combobox editor on the 1st visible column int vColIndex = 0; TableColumn typesCol = table.getColumnModel().getColumn(vColIndex); typesCol.setCellEditor(new MyComboBoxEditor(types));
vColIndex = 1; TableColumn featuresCol = table.getColumnModel().getColumn(vColIndex); featuresCol.setCellEditor(new MyComboBoxEditor(features));
vColIndex = 2; TableColumn delCol = table.getColumnModel().getColumn(vColIndex); delCol.setCellEditor(new ButtonEditor(new JCheckBox()));
// If the cell should appear like a combobox in its // non-editing state, also set the combobox renderer typesCol.setCellRenderer(new MyComboBoxRenderer(types)); featuresCol.setCellRenderer(new MyComboBoxRenderer(features)); delCol.setCellRenderer(new ButtonRenderer()); }
public class MyComboBoxRenderer extends JComboBox implements TableCellRenderer { public MyComboBoxRenderer(String[] items) { super(items); }
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); super.setBackground(table.getSelectionBackground()); } else { setForeground(table.getForeground()); setBackground(table.getBackground()); }
// Select the current value setSelectedItem(value); return this; } }
public class MyComboBoxEditor extends DefaultCellEditor { public MyComboBoxEditor(String[] items) { super(new JComboBox(items)); } }
public class ButtonRenderer extends JButton implements TableCellRenderer {
public ButtonRenderer() { setOpaque(true); }
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (isSelected) { setForeground(table.getSelectionForeground()); setBackground(table.getSelectionBackground()); } else{ setForeground(table.getForeground()); setBackground(UIManager.getColor("Button.background")); } setText( (value == null) ? "" : value.toString() ); return this; } }
public class ButtonEditor extends DefaultCellEditor { protected JButton button; private String label;
public ButtonEditor(JCheckBox checkBox) { super(checkBox); button = new JButton(); button.setOpaque(true); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { fireEditingStopped(); } }); }
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { if (isSelected) { button.setForeground(table.getSelectionForeground()); button.setBackground(table.getSelectionBackground()); } else{ button.setForeground(table.getForeground()); button.setBackground(table.getBackground()); } label = (value == null) ? "" : value.toString(); button.setText( label ); ((DefaultTableModel)table.getModel()).removeRow(row); return button; }
public Object getCellEditorValue() { return new String( label ); } } }
|
|