【问题标题】:Row data disappears when a JTable row is deselected取消选择 JTable 行时行数据消失
【发布时间】:2021-06-25 12:03:46
【问题描述】:

我有一个简单的JTable。 When a row is selected, it is highlighted as expected (see image):

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

我在运行 JetBrains IntelliJ 随附的 Java 11 JDK 的 Linux 上看到了这一点。

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

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);
    }
}

有什么想法吗?

【问题讨论】:

  • 我无法使用您的代码重现您的问题,我也没有在代码中看到任何明显的错误
  • 如果列不为 0 那么它根据您的三元运算符显示“”是否与它有什么关系?一个 null 或没有选择的列毕竟不是零
  • @experimentunit1998X:我不知道为什么 OP 的 getValueAt(...) 的结构是这样的,但是对于当前的表和模型,列不应该是任何东西 but 0 在方法中。
  • 如何取消选择该行?即使在 Windows 上按住 ctrl-click,此项目仍会保留一个边框。在您的屏幕截图中,似乎不存在边框。奇怪
  • 在我的测试中,我添加了一个JButton:JButton clearSelectionBtn = new JButton("Clear Selection"); clearSelectionBtn.addActionListener(e -> { table.clearSelection(); });

标签: java swing jtable


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多