Выбор строки JTable после обновления TableModel - PullRequest
4 голосов
/ 26 августа 2011

Как сохранить выбор строки таблицы после обновления режима таблицы (fireTableDataChanes)? Я знаю, что я должен сохранить выделение до пожара и восстановить его после (из там ). Но когда я пытаюсь восстановить выделение в TableModelListener, это не работает. Так где же мне восстановить выбор?

Обновление: Теперь я пытаюсь восстановить выбор следующим образом: table.setModel (модель);

    model.addTableModelListener(new TableModelListener() {

      @Override
      public void tableChanged(TableModelEvent e) {
        table.addRowSelectionInterval(1, 1);
      }
    });

но это не работает.

Ответы [ 3 ]

2 голосов
/ 01 октября 2014

Это обновленная версия первого ответа.Вы можете использовать поле для хранения строки, так как к ней могут обращаться внутренние классы.У меня были некоторые проблемы с этим решением, потому что я использовал периодический поток для обновления таблицы.

private int selectedRow = -1;

public void mymethod() {
//put code to create the table here...
    JTable tableList = new JTable();


// Save selected row table
    tableList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
        @Override
        public void valueChanged(ListSelectionEvent e) {
            selectedRow = e.getFirstIndex();
        }
    });

// Restore selected raw table
model.addTableModelListener(new TableModelListener() {      
    @Override
    public void tableChanged(TableModelEvent e) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                if (selectedRow >= 0) {
                            tableList.addRowSelectionInterval(index, index);
                }
             }
        });
    }
    });
}
0 голосов
/ 17 сентября 2014

Пример из первого ответа показывает базовое решение, но не будет работать из коробки. Невозможно изменить окончательный «selectedRow». Поэтому следует использовать изменяемое целое число (например, AtomicInteger). TamleModelListener отправляет задачу на качание, поэтому он вызывается позже - в большинстве случаев после того, как изменение таблицы уже убрало выбор. Поэтому selectedRow в большинстве случаев будет -1.

Я немного изменил приведенный выше пример (и добавил выделение одной ячейки, но это также работает для полных строк):

    final AtomicInteger selectedRow=new AtomicInteger(-1);
    final AtomicInteger selectedCol=new AtomicInteger(-1);
    tblZeiten.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
        @Override
        public void valueChanged(ListSelectionEvent e)
        {
            selectedRow.set(tblZeiten.getSelectedRow());
            selectedCol.set(tblZeiten.getSelectedColumn());
        }
    });
    tblZeiten.getModel().addTableModelListener(new TableModelListener() {      
        @Override
        public void tableChanged(TableModelEvent e)
        {
            TableCellEditor editor=tblZeiten.getCellEditor();
            if (editor!=null) editor.cancelCellEditing();

            final int row=selectedRow.get();
            final int col=selectedCol.get();
            if (row<0||col<0) return;

            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    // http://book.javanb.com/the-java-developers-almanac-1-4/egs/javax.swing.table/Sel.html
                    tblZeiten.changeSelection(row,col, false, false);
                 }
            });
        }
    });
0 голосов
/ 26 августа 2011

Решение простое: мы должны использовать Swing EventQueue:

final int selectedRow = 0;
// Save selected row table
tableList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
    @Override
    public void valueChanged(ListSelectionEvent e) {
        selectedRow = e.getFirstIndex();
    }
});

// Restore selected raw table
model.addTableModelListener(new TableModelListener() {      
    @Override
    public void tableChanged(TableModelEvent e) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                if (selectedRow >= 0) {
                            tableList.addRowSelectionInterval(index, index);
                }
             }
        });
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...