java - JTable 排序后添加行 bug

标签 java swing user-interface 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(),不起作用。

最佳答案

convert row index to model index doesn't work.

TableModelListenerTableModel 更改的监听器。因此 TableModelEvent 中的索引是相对于 TableModel 的。

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

应该是:

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

TableModel获取数据。

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

关于java - JTable 排序后添加行 bug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50421264/

相关文章:

java - 如何禁用 java.awt.Graphics.fillRect(int x, int y, int width, int height) 的效果?

java - swing:事件监听器支持类

java - 无法将列宽设置为零,即无法使列不可见

android - Qt 中的 GUI 或 Android 中的 GUI

java - 使用java集合存储一个键但多个值?

java - 单击按钮时如何在Java中的运行时强制转换对象

java - 如何在 Warlber 中设置源和目标 java 版本

java - 如何在插入记录时使用 spring jdbctemplate batchupdate 覆盖?

python - 在多个 Tkinter LabelFrames 之间使用网格对齐小部件

Javascript - GUI 编程