Странное поведение JTable при выборе строк

Я использую JTable внутри JScrollPane с пользовательской TableModel, отключенным выбором ячеек / столбцов и включенным только выбором строк (одиночный выбор). Если я выбираю строку, время от времени значение в ячейке, в которой я выполняю щелчок, также появляется в соседних столбцах (и перезаписывает значения в нем). Кто-нибудь может дать мне подсказку, что я делаю неправильно, или кто-то еще сталкивался с этой проблемой?

Заранее спасибо за помощь!

РЕДАКТИРОВАТЬ: я добавил SSCCE. После нескольких выборов проблема должна возникнуть. Вы можете ускорить его возникновение, удерживая мышь нажатой при наведении курсора на ряды. Если это произошло один раз, это происходит во время каждого выбора.

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;

public class TableIssueSSCCE {

    public TableIssueSSCCE() {
        JFrame frame = new JFrame();
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());

        JTable table = new JTable(new DefaultTableModel());
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        model.addColumn("Test1");
        model.addColumn("Test2");
        model.addColumn("Test3");
        model.addColumn("Test4");
        for (int i = 0; i < 1000; i++) {
            model.addRow(new String[]{
                "Column1" + i, "Column2" + i, "Column3" + i, "Column4" + i});
        }

        table.setFillsViewportHeight(true);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setCellSelectionEnabled(false);
        table.setColumnSelectionAllowed(false);
        table.setRowSelectionAllowed(true);
        table.setAutoCreateRowSorter(true);
        JScrollPane tableContainer = new JScrollPane(table);
        tableContainer.setVerticalScrollBar(new JScrollBar(JScrollBar.VERTICAL));
        tableContainer.setHorizontalScrollBar(new JScrollBar(JScrollBar.HORIZONTAL));
        frame.add(tableContainer, BorderLayout.CENTER);

        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new TableIssueSSCCE();
    }
}

2 ответа

Некоторые наблюдения:

  • Всякий раз, когда программа Swing работает неправильно, я начинаю искать неправильную синхронизацию, иногда прибегая к подходу, показанному здесь. Смотрите также Начальные темы. Поскольку такие ошибки могут быть трудно воспроизвести, лучше быть в безопасности:

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new TableIssueSSCCE();
        });
    }
    
  • Вместо setSize()переопределить getPreferredScrollableViewportSize(), как предлагается здесь.

Мне удалось избежать этой проблемы, перейдя на JRE Oracle. Так что эта проблема, похоже, связана с OpenJDK.

Другие вопросы по тегам