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

删除Jtable中的行后出错

唐永春
2023-03-14

我有一个框架,里面有一张桌子和两个按钮。

1) 重复行2)删除行

表a在第三列中的组合

我有一个场景,我复制空白行并点击最后一排的组合框来选择该行,然后单击删除行按钮…然后在删除后,每当我尝试单击任何单元格时,它都会给我以下错误。

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 6 >= 6
    at java.util.Vector.elementAt(Unknown Source)
    at javax.swing.table.DefaultTableModel.setValueAt(Unknown Source)
    at javax.swing.JTable.setValueAt(Unknown Source)
    at javax.swing.JTable.editingStopped(Unknown Source)
    at javax.swing.AbstractCellEditor.fireEditingStopped(Unknown Source)
    at javax.swing.DefaultCellEditor$EditorDelegate.stopCellEditing(Unknown Source)
    at javax.swing.DefaultCellEditor$3.stopCellEditing(Unknown Source)
    at javax.swing.DefaultCellEditor.stopCellEditing(Unknown Source)
    at javax.swing.plaf.basic.BasicTableUI$Handler.mousePressed(Unknown Source)
    at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$300(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

下面是相关框架的源代码

public class UI {

    JFrame frame;
    JTable TblFilePane1;

    UI()
    {
        Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension screen = kit.getScreenSize();

        frame = new JFrame("Web Automation Tool (Selenium)");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //frame.setResizable(false);
        frame.setLocation(screen.width/5, screen.height/300);       
        frame.setPreferredSize(new Dimension(1000, 820));
        frame.pack();
        frame.setVisible(true);

        final JPanel Pane1 = new JPanel(new BorderLayout());

        final JPanel FotterPanelPane1 = new JPanel(new BorderLayout());


        String columnNamesTestSuitePane1[] = { "Scope ID","Test Suite","Data File Required","Data File Path"};
        // Create some data
        String dataValuesTestSuitePane1[][] =
        {
            { "","","Yes","" },
        };      


        // Create a new table instance
        TblFilePane1 = new JTable( dataValuesTestSuitePane1, columnNamesTestSuitePane1 );
        TblFilePane1.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        TblFilePane1.getTableHeader().setReorderingAllowed(false);
        TblFilePane1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        DefaultTableModel modelPane1 = new DefaultTableModel(dataValuesTestSuitePane1, columnNamesTestSuitePane1);

        TblFilePane1.setModel(modelPane1);
        TblFilePane1.setRowHeight(22);
        final JScrollPane scrollPane1 = new JScrollPane( TblFilePane1 );
        //scrollPane1.setBounds(0, 0, 250, 250);

        //final LineNumberTableRowHeader TblFilePane1LineNumber = new LineNumberTableRowHeader(scrollPane1, TblFilePane1);
        //TblFilePane1LineNumber.setBackground(Color.orange);
        //scrollPane1.setRowHeaderView(TblFilePane1LineNumber);


        TableColumn ScopeIDPane1 = TblFilePane1.getColumnModel().getColumn(0);          
        ScopeIDPane1.setPreferredWidth(30);

        TableColumn TSIDPane1 = TblFilePane1.getColumnModel().getColumn(1);         
        ScopeIDPane1.setPreferredWidth(30);

        TableColumn dfReq = TblFilePane1.getColumnModel().getColumn(2);
        JComboBox cmbDfReq = new JComboBox();
        cmbDfReq.addItem("Yes");
        cmbDfReq.addItem("No"); 
        dfReq.setPreferredWidth(40);

        TableColumn DataFile = TblFilePane1.getColumnModel().getColumn(3);          
        DataFile.setPreferredWidth(490);

        TableColumn NotEditable = TblFilePane1.getColumnModel().getColumn(0);
        JTextField ScopeIDNE = new JTextField();
        ScopeIDNE.setEnabled(false);


        TableColumn NotEditableTS = TblFilePane1.getColumnModel().getColumn(1);
        JTextField TSIDNE = new JTextField();
        TSIDNE.setEnabled(false);

        NotEditableTS.setCellEditor(new DefaultCellEditor(TSIDNE));
        NotEditable.setCellEditor(new DefaultCellEditor(ScopeIDNE));
        dfReq.setCellEditor(new DefaultCellEditor(cmbDfReq));

        Border margin = new EmptyBorder(10, 10, 5, 10);
        FotterPanelPane1.setBorder(margin);

        FotterPanelPane1.add(scrollPane1,BorderLayout.CENTER);

        final JPanel BtnPanelPane1 = new JPanel();
        JButton BtnDuplicateRow = new JButton("Duplicate Row");
        JButton BtnDeleteRowPane1 = new JButton("Delete Row");
        BtnPanelPane1.add(BtnDuplicateRow);
        BtnPanelPane1.add(BtnDeleteRowPane1);

        Pane1.add(FotterPanelPane1,BorderLayout.CENTER);
        Pane1.add(BtnPanelPane1,BorderLayout.SOUTH);

        frame.add(Pane1);

        frame.pack();

        BtnDuplicateRow.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                DefaultTableModel model =  (DefaultTableModel)TblFilePane1.getModel();
                int totalRows = TblFilePane1.getRowCount();

                Vector data = model.getDataVector();

                int[] rows = TblFilePane1.getSelectedRows();
                 if(rows.length != 1)
                 {
                     JOptionPane.showMessageDialog(null, "Please Select one row to Duplicate !");
                 }

                 else
                 {
                     Vector row = (Vector) data.elementAt(rows[0]);
                     row = (Vector) row.clone();                     
                     model.addRow(row);
                 }
            }
        });


        BtnDeleteRowPane1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub                  

                int row = TblFilePane1.getSelectedRow();

                if(row < 0 )
                {
                    JOptionPane.showMessageDialog(null, "Please Select a Row to Delete !");
                    return;
                }
                ((DefaultTableModel) TblFilePane1.getModel()).removeRow(row);

            }
        });

    }


    public static void main(String args[])
    {
        new UI();

    }
    //frame.setMaximumSize(new Dimension(1000,820));
}

共有1个答案

鲁浩渺
2023-03-14

单击按钮时,编辑器仍处于活动状态。在删除行之前,需要停止编辑。

您可以将以下内容添加到您的ActionListener:

if (TblFilePane1.isEditing())
    TblFilePane1.getCellEditor().stopCellEditing();

您应该将它添加到两个侦听器中。或者,您可能希望查看表停止编辑,以获取您可以在表上设置的属性,以便在表失去焦点时停止编辑。

此外,变量名不应该以大写字母开头。学习并遵循Java约定。

 类似资料:
  • 我的Jtable有一个listSelectionListener: 我创建了一个按钮来删除带有事件的Jtable的所有行: 如果我在没有选择任何行的情况下按下按钮,则不会出现错误,但当我选择一行,然后按下按钮时,会出现以下错误: 当表没有ListSseltionListener时,不会发生这种情况。我哪里错了? 提前感谢您的帮助。

  • 我是新来的希望你们能帮我。。。 我是java编程的初学者,我想我对这个问题有点不知所措。 我的程序运行得很好,除了一个让我恼火的小细节。我有一个JTable,第一列有一个按钮,可以从表中删除这一行。它工作得很好,除了当我试图删除表的最后一行时,按钮停留在那里,然后表冻结,我无法删除任何行,因为我收到了一个“越界异常”。但是,当我使用命令表时。getRowCount()); 在删除该行之前和之后,表

  • 我正在用java创建一个没有数据库的库系统程序。(直接使用文件)。 我在删除jtable中的一行时遇到了一个奇怪的问题(也就是从文件中删除)。 有时当我在表格中选择一行并单击删除按钮时,不止一行被删除了! 大多数时候它也能正常工作!! 我的代码: 我的模型类: 用户信息类别: 我的文本文件:

  • 我正在尝试更新JTable(或data?)的行在我对一行执行删除操作后,当选择另一行时,可以编辑所选行。当前删除该行将使已删除行下方的行上移,但如果选择了该行号并尝试进行编辑,则会返回(JOptionPane),就像未选择任何内容一样。它似乎没有“刷新”数据(?)。 这是一个SCCE,希望有人可以运行它并指出问题。我试着尽可能地缩小它,以便于复制/粘贴: 我在这里看到这个问题的各种形式都有一些不同

  • 问题内容: 我需要删除JTable中的所有行。 我已经尝试了以下两种方法: 和 两者都不会删除所有行。有任何想法吗? 问题答案: 以下代码为我工作:

  • 问题内容: 我有一个JTable,我需要删除一行,即选定的行。 所以首先,我得到表模型: 然后是选定的行(如果选择了第二行,则返回1,这是可以理解的,因为行从零开始): 然后,我尝试删除该行: 然后我再次设置表模型: 这实现的是删除完全随机的行。我根本不明白为什么。我已经使用table.setRowSorter(sorter)对表进行了排序,但是我不知道为什么这应该是一个问题。如果绝对需要SSCC