【问题标题】:Deletion of JTable row with custom cell editor使用自定义单元格编辑器删除 JTable 行
【发布时间】:2013-09-20 14:17:04
【问题描述】:

我有一个 JTable,我在其中添加了一个 JButton(删除按钮)和一个 JComboBox 作为自定义单元格编辑器的两列。现在,当我在 Combobox 中选择一个项目并单击 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 中实例化了我的类的一个对象,然后单击表外的添加按钮,我添加了一行 model.addRow(new Object[]{"", "", "", "", "", ""});到我的桌子上。请帮助我找出我在哪里犯了错误。 谢谢。

【问题讨论】:

  • “已删除行的组合框呈现在该行上”是什么意思。 ?
  • 如需尽快获得更好的帮助,请发帖SSCCE。
  • 如果我的表有三行,我选择第二行的 ComboBox,其中包含“1”、“2”、“3”等项目,然后选择“2”项,然后删除该行,则第二行应显示以“2”为当前项的组合框。不是错误的行被删除。我已经检查过了。我附上代码供您参考。谢谢....
  • 这是代码.....我已经扩展了 CellRenderer 和 CellEditor 并在单击按钮时删除了一行...
  • @Shivani Kapur 这是代码.....你是在开玩笑吗,不好,知道更好的笑话,其他人也可以这样做,再次获得更好的帮助,尽快发布 SSCCE,跨度>

标签: java swing jtable tablecelleditor


【解决方案1】:

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

您可以尝试使用Table Button Column。我必须承认我从来没有在你的场景中尝试过这个类,但是代码确实调用了fireEditingStopped(),所以期望它应该可以工作。

编辑:

您可能会发现Table Stop Editing 很有用。

【讨论】:

  • 谢谢,我得检查一下。另外,当我添加新行时,新行显示具有所选索引的组合框作为先前删除的组合框的索引,我的意思是如果删除的行设置为索引 2,新添加的行也将设置为默认情况下索引 2 而不是 0。这个问题是否也是因为单元格仍处于编辑模式。
  • 谢谢,但我尝试了表格按钮以及停止编辑示例。没有任何效果。问题是,无论何时编辑组合框,然后删除或添加一行,表格都不会正确呈现单元格组件。它正在渲染已删除的组件。我不明白为什么会这样。
  • @ShivaniKapur,“删除”代码对我来说很好用。当您使用组合框中不存在的默认值创建行时,“addRow”方法会重置为上次编辑的值。这是默认功能,我不知道如何修复它。
猜你喜欢
  • 2012-08-05
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2012-10-04
  • 2011-09-27
  • 2021-02-12
  • 2015-01-27
  • 1970-01-01
相关资源
最近更新 更多