每当调用fireTableCellUpdated时,selectedRow都会被清除

时间:2013-01-24 10:27:58

标签: java swing jtable tablecelleditor listselectionlistener

我相信这是一个非常常见的问题,当我调用fireTableCellUpdated时,我的selectedRow被清除了。我试着通过调用它来保存我的行:

final int savedRow = mainTable.getSelectedRow();
...
if ( savedRow > 0 ) {
   mainTable.setRowSelectionInterval(savedRow, savedRow);
}

它不起作用,因为savedRow总是返回-1!

有谁知道如何防止我的selectedRow被清除?

2 个答案:

答案 0 :(得分:3)

一个简单的示例显示fireTableCellUpdated()上没有清除选择(由DefaultTableModel#setValueAt()调用:

import java.awt.EventQueue;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class TestTable {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                final DefaultTableModel model = new DefaultTableModel(3, 3);
                JTable table = new JTable(model);
                table.setRowSelectionInterval(1, 1);

                final Timer timer = new Timer(500, new ActionListener() {
                    private final Random random = new Random();
                    private int i;

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        model.setValueAt(i++, random.nextInt(3), random.nextInt(3));
                    }
                });
                timer.start();

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.addWindowListener(new WindowAdapter() {
                    @Override
                    public void windowClosed(WindowEvent e) {
                        timer.stop();
                    }
                });
                frame.getContentPane().add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

答案 1 :(得分:2)

如果没有选择行,则下面的语句将给出 -1

final int savedRow = mainTable.getSelectedRow();
  

当我调用fireTableCellUpdated时,我的selectedRow被清除

调用fireXXXMethod背后的原因是什么?如果表数据发生任何变化,则应调用这些方法。但在您的情况下,您不是在更改数据,而只是保存表中的数据。所以这里没有必要。

P.S:如需更快的帮助,请发布显示问题的代码。