JCheckBox搞砸了JTable的选择

时间:2014-11-05 08:48:41

标签: 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)

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

3 个答案:

答案 0 :(得分:1)

@不是Java7 / Win8的答案

the selection of the table seems to disappear. - 我无法模拟(应该是使用Nimbus L& F的问题)

mouse_hover_over

enter image description here

JCheckBox.isArmed

enter image description here

JCheckBox.isSelected

enter image description here

Java1.7.0_67 / Win7_64b

enter image description here

enter image description here

enter image description here

答案 1 :(得分:1)

代码在Linux上运行正常,无论是否有表格周围的滚动窗格

我不得不同意安德鲁的评论:

  • JTable放入JScrollPane
  • 或确保您自己添加标题,如JTable tutorial

    所示
    add(new JCheckBox("Example"), BorderLayout.PAGE_START);
    
    JPanel tablePanel = new JPanel(new BorderLayout());
    tablePanel.add(table.getTableHeader(), BorderLayout.PAGE_START );
    tablePanel.add(table, BorderLayout.CENTER );
    
    add(tablePanel, BorderLayout.CENTER);
    

答案 2 :(得分:1)

也许您需要在JFrame#pack()之后和JFrame#add(...)之前致电JFrame#setVisible(true)

  

How to Make Frames (Main Windows) (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
  创建和显示框架
  4.包装方法调整框架的尺寸,使其所有内容均等于或高于其首选尺寸。 pack的替代方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。

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