取消选择 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(...)
) 并在取消选择行时触发重绘,我已经能够以更稳健的方式解决该问题。
我有一个简单的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(...)
) 并在取消选择行时触发重绘,我已经能够以更稳健的方式解决该问题。