当前位置: 首页 > 知识库问答 >
问题:

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

云默
2023-03-14

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

我的代码是这样的:-

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按钮,我添加了一个行模型。addRow(新对象[]{、“”、“”、“”、“”、“”、“”、“”、“”});到我的桌子上去。请帮我找出我在哪里犯了错误。谢谢

共有1个答案

黎承颜
2023-03-14

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

您可以尝试使用表按钮列。我必须承认,我从未在您的场景中尝试过这个类,但代码确实调用了fireEditingStopped(),所以希望它能正常工作。

编辑:

您可能会发现表停止编辑很有用。

 类似资料:
  • 我创建了一个带有自定义表格呈现和自定义单元格编辑器的JTable,它在图像中给出结果 我使用一个扩展JPanel的单独类创建了第一个表格单元格中显示的面板。并将表值添加为, 这是我的表格自定义类来创建这个表格, 我的问题是认为面板如我预期的那样显示,我不能在文本字段中键入或更改复选框或单击按钮。请告诉我如何解决这个问题。

  • 问题内容: 我需要在jTable中显示数字,精确到小数点后两位。为此,我创建了一个自定义单元格编辑器,如下所示: 该单元格编辑器非常适合将点用作小数点的英语语言环境。但是在德语语言环境中,它不接受逗号作为小数点的值。请让我知道我的代码中有问题的地方。提前致谢。 编辑:这是我如何使其工作: 问题答案: 使用语言环境来发挥您的优势:

  • 我想要一个有4列的jtable。一列必须是组合框。其他列是字符串。 只要找到问题:在注释语句jcb.seteditable(true)时;,如果我在comboxcell上单击一次,它就会打开这个单元格。但我不知道为什么效果更好。此外,我希望combox可编辑。 我怎么能对其他细胞有同样的行为。 再次您好,我已经更新了代码,以便使-如果我通过重写方法在单元格上单击一次,单元格可以编辑-如果我通过重写

  • 设计定制JTable我已经知道DefaultCellEditor在其构造函数中允许使用JComboBox。单击此JComboBox以显示列表项时,它显示在JTable的其他单元格上方。问题是,我需要一个更复杂的行为,就像JComboBox提供的那样,这样我就用一个JList和一个JButton实现了一个JTextField,当点击JButton(或者用户在JTextField中输入文本)时,JLi

  • 我有一个JTable,它应该是2列(String,JComboBox)。当我初始化表时,一切看起来都很好。只要一个I在表中选择了一个值,JComboBox单元格就会获取所选项的数据类型。 我想保持JCOmboBox在那里,让它触发数据更改事件,表忽略该列中的数据更改,并保持ComboBox填充。 我的表将此作为覆盖