【发布时间】:2012-01-17 17:10:40
【问题描述】:
如果我将 JCheckBox 放在 JTree 之外,它会在我将鼠标悬停在它上面时播放动画。当我在 JTree 节点中放置相同的 JCheckbox 时,它不再接收任何 mouseMoved() 事件并且不播放动画。我尝试将这些事件从 JTree 转发到 JCheckBox,但没有任何显示。
我猜问题是同一个 JCheckBox 实例被 JTree“标记”(每个节点一次)。当我将 mouseMoved() 事件转发给共享实例时,它不知道在哪里重新绘制自己。
有什么想法吗?
编辑:这是一个独立的测试用例。请注意,使 JCheckBox 可点击超出了这个问题的范围(我已经在我的应用程序中使用 TreeCellEditor 这样做了)。
import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;
public class HoverBug
{
public static class TreeRenderer implements TreeCellRenderer
{
private final JCheckBox checkbox = new JCheckBox();
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row, boolean hasFocus)
{
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
checkbox.setSelected((Boolean) node.getUserObject());
return checkbox;
}
}
public static void main(String[] args)
{
JCheckBox checkbox = new JCheckBox("See... this works!");
DefaultMutableTreeNode root = new DefaultMutableTreeNode(Boolean.TRUE);
DefaultMutableTreeNode child1 = new DefaultMutableTreeNode(Boolean.FALSE);
DefaultMutableTreeNode child2 = new DefaultMutableTreeNode(Boolean.FALSE);
root.add(child1);
root.add(child2);
DefaultTreeModel model = new DefaultTreeModel(root);
JTree tree = new JTree(model);
tree.setCellRenderer(new TreeRenderer());
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(checkbox, BorderLayout.NORTH);
frame.getContentPane().add(tree, BorderLayout.CENTER);
frame.setSize(800, 600);
frame.setVisible(true);
}
【问题讨论】:
-
你是对的。 JCheckBox 用作渲染器。 JTree 是接收鼠标事件的组件。如果你有一个独立的代码示例,我可以提供进一步的帮助。
-
您可能必须实现自己的渲染器。
-
@Kylar:我添加了一个测试用例。
-
我用 mouseClicked() 实现了一个简单的,但逻辑是相同的,以检测你想要在 mouseMoved、mouseEntered 等中的哪个节点。
标签: java swing mouseover jtree