如果我將一個JCheckBox放置在JTree之外,則將其懸停在它上面時播放動畫。當我在JTree節點中放置相同的JCheckbox時,它不再接收任何mouseMoved()事件並且不播放動畫。我嘗試將這些事件從JTree轉發到JCheckBox,但沒有顯示出來。將mouseMoved()事件轉發給JTree節點?
我猜測問題是相同的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 2012-01-17 17:13:12
您可能必須實現自己的渲染器。 – mre 2012-01-17 17:14:18
@Kylar:我已經添加了一個測試用例。 – Gili 2012-01-17 17:34:55