gpt4 book ai didi

java - 使用自定义单元格编辑器删除 JTable 行

转载 作者:行者123 更新时间:2023-12-01 14:05:47 31 4
gpt4 key购买 nike

我有一个 JTable,其中添加了 JButton(删除按钮)和 JComboBox 作为两列上的自定义单元格编辑器。现在,当我在组合框中选择一个项目并单击“删除”按钮时,所选行将被删除,但已删除行的组合框将呈现在该行上。我是否还必须从表格中删除单元格编辑器?如果我不选择组合框,代码可以正常工作。请帮我。

这就是我的代码的样子:-

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 中实例化了我的类的一个对象,然后单击表外的“添加”按钮,添加了一行 model.addRow(new Object[]{"", "", "", "", "", “”});到我的 table 上。请帮助我找出我在哪里犯了错误。谢谢。

最佳答案

听起来组合框单元格仍处于编辑模式。在删除行之前,您需要确保单元格上的编辑已被取消。

您可以尝试使用Table Button Column 。我必须承认我从未在您的场景中尝试过此类,但代码确实调用了 fireEditingStopped(),因此预计它应该可以工作。

编辑:

您可能会找到Table Stop Editing有用。

关于java - 使用自定义单元格编辑器删除 JTable 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18918985/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com