-1

これは非常に一般的な問題だと思います。fireTableCellUpdated を呼び出すと、selectedRow がクリアされます。これを呼び出して行を保存しようとしました:

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

savedRow は常に -1 を返すため、機能しません!

selectedRowがクリアされないようにする方法を知っている人はいますか??

4

2 に答える 2

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);
            }
        });
    }
}
于 2013-01-24T11:29:52.987 に答える
2

以下のステートメントは、行が選択されていない場合、 -1を返します。

final int savedRow = mainTable.getSelectedRow();

fireTableCellUpdated を呼び出すと、selectedRow がクリアされます

を呼び出す理由は何fireXXXMethodですか? これらのメソッドは、テーブル データが変更された場合に呼び出す必要があります。しかし、あなたの場合、データを変更するのではなく、テーブルにあるデータを保存するだけです。したがって、ここでは必要ありません。

PS: すぐにヘルプが必要な場合は、問題を示すコードを投稿してください。

于 2013-01-24T11:56:21.317 に答える