我在Swing应用程序中有一个JTable
。我有一个JCheckBox
来切换列的可见性。现在,每当我从表格中选择一行并将鼠标移到复选框上时,表格的选择似乎就消失了。
我还在应用程序的表中添加了ListSelectionListener
。当我通常选择带有表格的单元格时,它会发出两个更改事件(一个用于鼠标按下,一个用于鼠标向上)。然而,当上述奇怪发生时,我得到了四个事件。
这是一个产生效果的简化示例:
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)
编辑。我发现了这种奇怪的行为。最大化框架时效果会完全消失,只有重新启动应用程序才会重新出现。
答案 0 :(得分:1)
@不是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
答案 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)
。
Windows 7 x64上How to Make Frames (Main Windows) (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
创建和显示框架
4.包装方法调整框架的尺寸,使其所有内容均等于或高于其首选尺寸。 pack的替代方法是通过调用setSize或setBounds(也设置帧位置)显式建立帧大小。
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);
}
}