java - JCheckBox 搞乱了 JTable 的选择

标签 java swing jtable selection

我在 Swing 应用程序中有一个 JTable。我在上面有一个 JCheckBox 来切换列的可见性。现在,每当我从表中选择一行并将鼠标移到复选框上时,表的选择似乎就会消失。

我还在应用程序的表中添加了一个ListSelectionListener。当我通常选择带有表格的单元格时,它会发出两个更改事件(一个用于鼠标按下,一个用于鼠标向上)。然而,当上述奇怪的事情发生时,我得到了四个事件。

weirdness 1

weirdness 2

这是一个产生效果的简化示例:

import java.awt.BorderLayout;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class JTableSelection extends JFrame {
    public JTableSelection() {
        super("Test");
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {}
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        JTable table = new JTable();
        table.setModel(new DefaultTableModel(new String[] { "item", "another",
                "one more" }, 3));
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        add(new JCheckBox("Example"), BorderLayout.PAGE_START);
        add(new JScrollPane(table), BorderLayout.CENTER);
    }
    public static void main(String[] args) {
        new JTableSelection().setVisible(true);
    }
}

为什么选择会出现这样的故障(或者有人知道)?我怎样才能让它发挥作用?

如果重要的话,运行此版本的 Java VM 版本是:

java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)

编辑。我发现了一个奇怪的行为。当最大化框架时,效果完全消失,只有重新启动应用程序才能重新出现。

最佳答案

也许您需要在 JFrame#add(...) 之后和 JFrame#setVisible(true) 之前调用 JFrame#pack() >.

How to Make Frames (Main Windows) (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
Creating and Showing Frames
4. The pack method sizes the frame so that all its contents are at or above their preferred sizes. An alternative to pack is to establish a frame size explicitly by calling setSize or setBounds (which also sets the frame location).

Windows 7 x64 上的 1.7.0_72
发生相同或类似的事情JButton + JScrollPane + JTree:

enter image description here

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JTreeSelection extends JFrame {
  public JTreeSelection() {
    super("Test");
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {}
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLayout(new BorderLayout());
    add(new JButton("Example"), BorderLayout.PAGE_START);
    add(new JScrollPane(new JTree()), BorderLayout.CENTER);
    //pack();
    //setSize(320, 240);
  }
  public static void main(String[] args) {
    //You may also need to understand the EDT
    //EventQueue.invokeLater(new Runnable() {
    //  @Override public void run() {
    //      new JTreeSelection().setVisible(true);
    //  }
    //});
    new JTreeSelection().setVisible(true);
  }
}

关于java - JCheckBox 搞乱了 JTable 的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26752897/

相关文章:

java - 2 个持久单元之间的 Hibernate 链接?

java - 从抽象类继承方法错误

java - 在 MySQL 中创建自定义结果集

java - 绑定(bind)抛出异常

java - Java JList格式与JTable的功能

java - 在 Java 11 上运行 Spring Boot "Hello World"?

java - 我可以使用 Grails 但使用 Java 编写代码吗?

java - 这两个例子中哪一个是更好的代码设计?

java - 在文本文件中逐行单词

Java 1.5 过滤器 JTable