取消选择 JTable 行时行数据消失

Row data disappears when a JTable row is deselected

我有一个简单的JTable。选择一行后,它会按预期突出显示(见图):

但是当取消选择行时,行数据消失(见图):

我在 JetBrains IntelliJ 附带的 Linux 运行 Java 11 JDK 上看到了这个。

这是一个重现问题的独立示例:

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

public class Main
{
    public static void main(String[] args)
    {
        JTable table = new JTable();
        table.setRowSelectionAllowed(true);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setModel(new AbstractTableModel()
        {
            @Override
            public String getColumnName(int column)
            {
                return "Item";
            }

            @Override
            public int getRowCount()
            {
                return 10;
            }

            @Override
            public int getColumnCount()
            {
                return 1;
            }

            @Override
            public Object getValueAt(int row, int col)
            {
                return col == 0 ? "Test string #" + row : "";
            }
        });

        JFrame frame = new JFrame("Test JTable");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(table);
        frame.setMinimumSize(new Dimension(250, 200));
        frame.pack();
        frame.setVisible(true);
    }
}

有什么想法吗?

显然这是由以下已知错误引起的:https://bugs.openjdk.java.net/browse/JDK-8202702

顺便说一句,我现在也可以使用 OpenJDK 11 在 Windows 10 中重现该问题。

链接的错误报告指的是一个不同的用例(从 MouseListener 中选择和取消选择行),但是我已经确认根本问题是相同的,并且“解决方法”(覆盖JTable 中的 getSelectedRow() 方法 return -2 而不是 -1) 有效,尽管这显然不是正确的解决方法。

通过注册选择侦听器 (jtable.getSelectionModel().addListSelectionListener(...)) 并在取消选择行时触发重绘,我已经能够以更稳健的方式解决该问题。