我在JScrollPane中使用JTable,其中自定义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();
}
}
答案 0 :(得分:1)
我可以通过改用Oracle的JRE来避免这个问题。所以这个问题似乎与OpenJDK有关。
答案 1 :(得分:1)
一些观察结果:
每当Swing程序间歇性地出现异常时,我就会开始寻找不正确的同步,有时会采用here所示的方法。另见Initial Threads。因为这些错误可能难以重现,所以最好是安全的:
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
new TableIssueSSCCE();
});
}
取代setSize()
,覆盖getPreferredScrollableViewportSize()
,建议here。