[英]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.