JTable 在排序错误后添加行



我有一个JTable,它setAutoCreateRowSorter(true),以便我可以对行进行排序。当我在不使用排序的情况下向表中添加一行时,它工作正常。但是当我首先对表格进行排序时(只需单击列标题,行就会被排序(,然后在有问题的表格中添加一行。
我用tableModel.addRow(new Object[]{row,row});来添加一行,TableModelListener来侦听插入事件。该错误在TableModelListener中,这意味着我找不到刚刚添加的行,java.lang.ArrayIndexOutOfBoundsException: 3
这是我的SSCCE,这是一个带有表格的对话框,单击"添加"按钮向表格添加一行。

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import java.awt.GridLayout;
import javax.swing.JTable;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JScrollPane;
public class MainTable extends JDialog {

private static final long serialVersionUID = 156332386872772726L;
private final JPanel contentPanel = new JPanel();
private DefaultTableModel tableModel;
private JTable table;
public static void main(String[] args) {
try {
MainTable dialog = new MainTable();
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
public MainTable() {
setBounds(100, 100, 450, 300);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
getContentPane().add(contentPanel, BorderLayout.CENTER);
contentPanel.setLayout(new GridLayout(1, 0, 0, 0));
{
JScrollPane scrollPane = new JScrollPane();
contentPanel.add(scrollPane);
{
table = new JTable();
table.setAutoCreateRowSorter(true);
tableModel = new DefaultTableModel(new String[]{"first","second"},0);
table.setModel(tableModel);
tableModel.addTableModelListener(new TableModelListener(){
@Override
public void tableChanged(TableModelEvent arg0) {
if(arg0.getType() == TableModelEvent.INSERT){
int row = arg0.getFirstRow();
System.out.println(table.getValueAt(row, 0));//bug!! I couldn't find the row I added.
}
}
});
scrollPane.setViewportView(table);
}
}
{
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
getContentPane().add(buttonPane, BorderLayout.SOUTH);
{
JButton okButton = new JButton("Add");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int row = tableModel.getRowCount();
tableModel.addRow(new Object[]{row,row});//click button to add a row
}
});
buttonPane.add(okButton);
getRootPane().setDefaultButton(okButton);
}
}
}
}

我尝试了什么

  • 将行索引转换为模型索引不起作用。
  • 使用tableModel.insert()代替tableModel.add(),不起作用。

将行索引转换为模型索引不起作用。

TableModelListenerTableModel更改的侦听器。所以TableModelEvent中的索引是相对于TableModel

System.out.println(table.getValueAt(row, 0));

应该是:

System.out.println(table.getModel().getValueAt(row, 0));

TableModel获取数据。

或者,如果要从JTable获取数据,则需要使用convertRowIndexToView(...)方法。

最新更新