简体   繁体   English

删除所有行时的JTable我得到java.lang.ArrayIndexOutOfBoundsException:-1如果选择了该行

[英]JTable when removing all rows I get java.lang.ArrayIndexOutOfBoundsException: -1 if that row was selected

The appropiate way to remove all rows from a table is to use: 从表中删除所有行的合适方法是使用:

 DefaultTableModel tableModel = (DefaultTableModel) tablaPedidos.getModel();


        if (tableModel.getRowCount() > 0) {
            for (int i = tableModel.getRowCount() - 1; i > -1; i--) {
                tableModel.removeRow(i);
            }
        }

However in my application I have a series of tabbedPanes for example tabbedPane 1 and tabbedPane 2, the tabbedPane 2 contains a JTable. 但是在我的应用程序中,我有一系列的tabbedPanes,例如tabbedPane 1和tabbedPane 2,而tabbedPane 2包含一个JTable。 My goal is to clean the JTable when I switch between panes. 我的目标是在窗格之间切换时清理JTable。

However I am getting a strange functionality, it works fine only when none of the rows of the JTable are selected, when one row was left selected in the table and then I switch between tabbedPanes after I enter in tabbedPane 2 I get an exception in the ListSelectionListener. 但是我得到了一个奇怪的功能,它仅在没有选择JTable的行,在表中保留一行时才有效,然后在输入tabbedPane 2后在tabbedPanes之间切换时,在ListSelectionListener。

//If a row in the table was left selected when I switched between tabbedPanes I get a ArrayIndexOutOfBoundsException exception when running this code
        table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
        public void valueChanged(ListSelectionEvent event) {
            if(!event.getValueIsAdjusting()) {
                String numeroPedido = table.getValueAt(table.getSelectedRow(), 0).toString();

            }
        }
    });


Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.Vector.elementData(Vector.java:730)
    at java.util.Vector.elementAt(Vector.java:473)
    at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:649)

I just don't get it what's the influence of having a row selected to get this exception. 我只是不知道选择一个行来获取此异常有什么影响。

Example code: 示例代码:

Container.java, that contains both of the TabbedPanes Container.java,其中包含两个TabbedPanes

package testClearTable;


import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.JTabbedPane;


public class Container extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Container frame = new Container();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Container() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 926, 556);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        contentPane.add(tabbedPane, BorderLayout.CENTER);

        TabbedPane1 tabbedPane1 = new TabbedPane1();
        tabbedPane.addTab("TabbedPane1", null, tabbedPane1, null);

        TabbedPane2 tabbedPane2 = new TabbedPane2();
        tabbedPane.addTab("TabbedPane2", null, tabbedPane2, null);



        ChangeListener changeListener = new ChangeListener() {
              public void stateChanged(ChangeEvent changeEvent) {
                JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent.getSource();
                int index = sourceTabbedPane.getSelectedIndex();

                if(sourceTabbedPane.getTitleAt(index).equals("TabbedPane2")) {
                    Random r = new Random();
                    int randomNumber = r.nextInt(101);
                    TabbedPane2.updateTable(randomNumber);
                    System.out.println("Update table.");
                }


                System.out.println("Tab changed to: " + sourceTabbedPane.getTitleAt(index));
              }
            };

            tabbedPane.addChangeListener(changeListener);
    }


}

TabbedPane1.java TabbedPane1.java

package testClearTable;

import javax.swing.JPanel;

public class TabbedPane1 extends JPanel {

    /**
     * Create the panel.
     */
    public TabbedPane1() {

    }

}

TabbedPane2.java TabbedPane2.java

package testClearTable;

import java.util.ArrayList;

import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;




public class TabbedPane2 extends JPanel {
    private static JTable table;

    /**
     * Create the panel.
     */
    public TabbedPane2() {
        setLayout(new MigLayout("", "[][grow]", "[][grow]"));

        JScrollPane scrollPane = new JScrollPane();
        add(scrollPane, "cell 1 1,grow");

        table = new JTable();
        scrollPane.setViewportView(table);

        table.setModel(new DefaultTableModel(
                new Object[][] {
                },
                new String[] {
                    "Col 1", "Col 2", "Col 3"
                }
            ));

        addDummyData();

        table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
            public void valueChanged(ListSelectionEvent event) {
                if(!event.getValueIsAdjusting()) {
                    String numeroPedido = table.getValueAt(table.getSelectedRow(), 0).toString();

                }
            }
        });
    }

    public void addDummyData() {
        for(int i = 0 ; i < 10; i++) {
            Object [] fila = new Object[table.getModel().getColumnCount()];

            fila[0] = String.valueOf(i);
            fila[1] = String.valueOf(i);
            fila[2] = String.valueOf(i);


            ((DefaultTableModel) table.getModel()).addRow(fila);
        }   
    }

    public static  void addDummyData2(int k) {
        for(int i = 0 ; i < k; i++) {
            Object [] fila = new Object[table.getModel().getColumnCount()];

            fila[0] = String.valueOf(i);
            fila[1] = String.valueOf(i);
            fila[2] = String.valueOf(i);


            ((DefaultTableModel) table.getModel()).addRow(fila);
        }   
    }

    private static void clearTable() {
        DefaultTableModel tableModel = (DefaultTableModel) table.getModel();

        if (tableModel.getRowCount() > 0) {
            for (int i = tableModel.getRowCount() - 1; i > -1; i--) {
                tableModel.removeRow(i);
            }
        }
    }



    public static  void updateTable(int i) {
        clearTable();
        addDummyData2(i);
    }

}

也许在删除所有数据之前调用JTable.clearSelection()?

The problem comes from the addListSelectionListener . 问题来自addListSelectionListener。 The ListSelectionEvent has been triggered and after cleaning the table and writing again there is no row selected. ListSelectionEvent已触发,清理表并再次写入后,未选择任何行。

        public void valueChanged(ListSelectionEvent event) {
            if(!event.getValueIsAdjusting()) {
                if(tablaPedidos.getSelectedRow() > -1) {

When adding the verification to only perform an action when there is an actual row selected I dont get the exception. 当添加验证仅在选择了实际行时才执行操作时,我没有得到例外。

What I don't understand why clearing and writing again is triggering the ListSelectionEvent. 我不明白为什么再次清除和写入会触发ListSelectionEvent。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 JTable 在行添加/删除后返回 java.lang.ArrayIndexOutOfBoundsException - JTable returns java.lang.ArrayIndexOutOfBoundsException after rows add/removal 刷新JTable时显示java.lang.ArrayIndexOutOfBoundsException的GUI - GUI showing java.lang.ArrayIndexOutOfBoundsException when refreshing JTable Java JTable / DefaultTableModel java.lang.ArrayIndexOutOfBoundsException - Java JTable / DefaultTableModel java.lang.ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException: 0 &gt;= 0 试图填充 JTable - java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 attempting to populate JTable 带有抛出java.lang.ArrayIndexOutOfBoundsException的线程的JTable - JTable with Thread throwing java.lang.ArrayIndexOutOfBoundsException JTable错误:java.lang.ArrayIndexOutOfBoundsException:1&gt; = 0 - JTable error: java.lang.ArrayIndexOutOfBoundsException: 1 >= 0 JTable 中的错误 java.lang.ArrayIndexOutOfBoundsException: 7 &gt;= 7 - Error in JTable java.lang.ArrayIndexOutOfBoundsException: 7 >= 7 为什么会收到“ java.lang.ArrayIndexOutOfBoundsException:0” - Why do I get an “java.lang.ArrayIndexOutOfBoundsException: 0” 如何摆脱此java.lang.ArrayIndexOutOfBoundsException错误? - How do i get rid of this java.lang.ArrayIndexOutOfBoundsException error? 为什么我在这里得到 java.lang.ArrayIndexOutOfBoundsException ? - Why do I get java.lang.ArrayIndexOutOfBoundsException here?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM