Заполнение JTable не изменяет содержимое выбранной ячейки и вызывает редактирование ячейки;как я могу обойти это? - PullRequest
3 голосов
/ 03 марта 2012

У меня есть приложение, которое использует JTables для отображения данных, и ячейки доступны для редактирования, так что пользователь может изменять данные. Пользователь также может отменить изменения или загрузить данные из внешнего источника. Однако, если пользователь возвращает / загружает данные с помощью сочетания клавиш, чтобы фокус мыши не убирался из таблицы, текущая выбранная ячейка не восстанавливается. Фактически, после обновления ячейка переходит в режим редактирования! Затем, когда пользователь уходит из этой ячейки, запускается событие изменения, поэтому старое значение возвращается в хранилище данных.

У меня есть небольшой пример программы, которая демонстрирует эту проблему. Он показывает таблицу, в которой в каждой ячейке отображается значение 0. Также имеется меню «Файл» с единственным элементом меню «Инкремент», который имеет сочетание клавиш Ctrl-I. Каждый раз, когда вызывается команда увеличения, она увеличивает число, отображаемое во всех ячейках. Чтобы увидеть проблему, сделайте следующее:

  1. Скомпилируйте и запустите программу
  2. Несколько раз нажмите Ctrl-I, чтобы вызвать команду Increment. Обратите внимание, что значения ячеек увеличиваются каждый раз.
  3. Нажмите на ячейку.
  4. Несколько раз нажмите Ctrl-I, чтобы вызвать команду Increment. Обратите внимание, что все значения ячеек увеличиваются на , кроме того, которое выбрано.

Я пробовал различные методы, чтобы удалить выборку из таблицы перед ее обновлением, но безрезультатно. Ни один

table.editCellAt(-1, -1);

ни

table.getSelectionModel().clearSelection();

работал, например.

Вот пример программы:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableBug extends JFrame {
    private static final int ROW_COUNT = 3;
    private static final int COL_COUNT = 3;

    private int mDataValue = 0;
    private DefaultTableModel mTableModel;

    // Constructor
    public TableBug() {
        setTitle("TableBug");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        // Create table model and table
        mTableModel = new DefaultTableModel();        

        for (int col = 0; col < COL_COUNT; col++) {
            mTableModel.addColumn("Value");
        }

        JTable table = new JTable(mTableModel);
        setUpTable(table);
        refresh();

        // Create menu bar
        int keyMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();

        JMenu fileMenu = new JMenu("File");

        JMenuItem incrementMenuItem = new JMenuItem("Increment");
        incrementMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, keyMask));
        incrementMenuItem.addActionListener(new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                doIncrement();
            }
        });

        fileMenu.add(incrementMenuItem);

        JMenuBar mainMenuBar = new JMenuBar();
        mainMenuBar.add(fileMenu);

        // Populate GUI
        setJMenuBar(mainMenuBar);
        add(new JScrollPane(table), BorderLayout.CENTER);

        // Display window
        pack();
        setVisible(true);
    }

    // Configures the table
    private void setUpTable(JTable table) {
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        table.getTableHeader().setReorderingAllowed(false);
        table.getTableHeader().setResizingAllowed(false);

        table.setRowSelectionAllowed(false);
    }

    // Populates the table
    private void refresh() {
        mTableModel.setRowCount(ROW_COUNT);

        for (int col = 0; col < COL_COUNT; col++) {
            for (int row = 0; row < ROW_COUNT; row++) {
                mTableModel.setValueAt(mDataValue, row, col);
            }
        }
    }

    // Handles the Increment menu item
    public void doIncrement() {
        mDataValue++;
        refresh();
    }

    // Main program
    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TableBug();
            }
        });
    }
}

1 Ответ

3 голосов
/ 03 марта 2012

В вашей функции обновления проверьте, редактируется ли таблица.Если это так, получите редактируемую строку и столбец и остановите редактирование ячейки.

private void refresh() {
    if (table.isEditing()) {
        int row = table.getEditingRow();
        int column = table.getEditingColumn();
        table.getCellEditor(row, column).stopCellEditing();
    }
 ...

Для этого вам нужно сделать вашу переменную таблицы доступной (сделать ее переменной класса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...