簡體   English   中英

JCheckBox弄亂了JTable的選擇

[英]JCheckBox messing up JTable's selection

我在Swing應用程序中有一個JTable 我有一個JCheckBox來切換列的可見性。 現在,每當我從表格中選擇一行並將鼠標移到復選框上方時,表格的選擇似乎就會消失。

我還向應用程序中的表添加了ListSelectionListener 通常,我在表格中選擇一個單元格時,它將發出兩個更改事件(一個按下鼠標,一個按下鼠標)。 但是,當發生上述怪異現象時,我得到了四個事件。

怪異1

怪異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)

編輯。 我發現了這種奇怪的行為。 當最大化幀時,效果將完全消失,並且僅通過重新啟動應用程序才能重新出現。

@不是答案Java7 / Win8

the selection of the table seems to disappear. -我無法模擬(使用Nimbus L&F應該是一個問題)

mouse_hover_over

在此處輸入圖片說明

JCheckBox.isArmed

在此處輸入圖片說明

JCheckBox.isSelected

在此處輸入圖片說明

Java1.7.0_67 / Win7_64b

在此處輸入圖片說明

在此處輸入圖片說明

在此處輸入圖片說明

無論是否在表格周圍使用滾動窗格,代碼在Linux上均可正常運行

我必須同意安德魯的評論:

  • 要么將JTable放入JScrollPane
  • 或確保您自己按照JTable教程中所示添加標頭

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

也許您需要在JFrame#add(...)JFrame#setVisible(true)之前調用JFrame#pack() JFrame#setVisible(true)

如何制作框架(主窗口)(Java™教程>使用JFC / Swing創建GUI>使用Swing組件)
創建和顯示框架
4.包裝方法調整框架的大小,以使框架中的所有物品均在其首選尺寸以上。 打包的另一種方法是通過調用setSize或setBounds(也設置幀位置)顯式建立幀大小。

在Windows 7 x64上為1.7.0_72
發生相同或相似的事情JButton + JScrollPane + JTree

在此處輸入圖片說明

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM