Удаление строки JTable с помощью пользовательского редактора ячеек
У меня есть JTable, в котором я добавил JButton(кнопка Удалить) и JComboBox в качестве пользовательских редакторов ячеек на двух столбцах. Теперь, когда я выбираю элемент в Combobox и нажимаю кнопку "Удалить", выбранная строка удаляется, но в строке отображается комбинированный список удаленной строки. Нужно ли убирать редактор ячеек из таблицы. Код работает нормально, если я не выбрал свой выпадающий список. Пожалуйста, помогите мне.
Вот как выглядит мой код:
class JTableRenderer extends JButton implements TableCellRenderer, TableCellEditor{
private JComboBox sens_type_cb;
@Override
public Component getTableCellRendererComponent(final JTable table, Object value, final boolean isSelected, final boolean hasFocus, final int row, int column) {
if(column == 1)
{
System.out.println("Row " + row);
sens_type_cb = new JComboBox(new String[]{"Radar", "EO", "Aerial", "UAV", "Other"});
return sens_type_cb;
}
}
@Override
public void addActionListener(ActionListener listener)
{
sens_type_cb.addActionListener(listener);
}
@Override
public Component getTableCellEditorComponent(final JTable table, Object value, boolean isSelected, final int row, int column) {
if(column == 1)
{
ActionListener listen = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
if (table.isEditing())
table.getCellEditor().stopCellEditing();
//table.clearSelection();
}
};
sens_type_cb.addActionListener(listen);
return sens_type_cb;
}
else
return super.getParent();
}
public void addActionListener(ActionListener listener)
{
sens_type_cb.addActionListener(listener);
}
Next I create Class SensorConf in which I create a table:-
public class SensorConf extends javax.swing.JFrame {
private static SensorConf conf_obj = new SensorConf();
/* A private Constructor prevents any other class from instantiating. */
//private SensorConf(){ }
/* Static 'instance' method */
public static SensorConf getInstance( ) {
return conf_obj;
}
Action delete = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
JTable table = (JTable)e.getSource();
int modelRow = Integer.valueOf( e.getActionCommand() );
((DefaultTableModel)table.getModel()).removeRow(modelRow);
}
};
public void CreateTable()
{
// jTable1.setModel(model);
jTable1.getColumn("S.No.").setPreferredWidth(40);
jTable1.getColumn("Sensor Type").setPreferredWidth(80);
jTable1.getColumn("").setPreferredWidth(40);
jTable1.getColumnModel().getColumn(1).setResizable(false);
jTable1.getTableHeader().setReorderingAllowed(false);
jTable1.setRowHeight(25);
javax.swing.table.DefaultTableModel model = (javax.swing.table.DefaultTableModel)jTable1.getModel();
model.addRow(new Object[]{"", "", "", "", "", ""});
JTableRenderer tableRenderer = new JTableRenderer();
model.getRowCount();
model.setValueAt(new Integer(model.getRowCount()), model.getRowCount()-1,0);
jTable1.getColumnModel().getColumn(1).setCellEditor(tableRenderer);
jTable1.getColumnModel().getColumn(1).setCellRenderer(tableRenderer);
ButtonColumn buttonColumn = new ButtonColumn(jTable1, delete, 6);
}
private SensorConf() {
initComponents();
CreateTable();
}
Я создаю экземпляр объекта моего класса в main и, нажав кнопку Add вне таблицы, я добавляю строку model.addRow(new Object[]{"", "", "", "", "", ""}); к моему столу. Пожалуйста, помогите мне узнать, где я совершаю ошибку. Благодарю.
1 ответ
Похоже, что ячейка comboBox все еще находится в режиме редактирования. Вы должны убедиться, что редактирование ячейки было отменено, прежде чем удалять строку.
Вы можете попробовать использовать Столбец Кнопка Столбец. Я должен признать, что я никогда не пробовал этот класс в вашем сценарии, но код вызывает fireEditingStopped()
, так что ожидайте, что это должно работать.
Редактировать:
Вы можете найти полезной Редактирование Стоп Стола.