JCheckBoxをJTreeの外に置くと、その上にマウスを置くとアニメーションが再生されます。同じJCheckboxをJTreeノード内に配置すると、mouseMoved()イベントは受け取られず、アニメーションも再生されません。これらのイベントをJTreeからJCheckBoxに転送しようとしましたが、何も表示されません。JTreeノードにmouseMoved()イベントを転送しますか?
私は、同じJCheckBoxインスタンスがJTreeによって(ノードごとに1回)「スタンプされている」ということを推測しています。 mouseMoved()イベントを共有インスタンスに転送すると、それ自体を再描画する場所がわかりません。
アイデア?
EDIT:ここには自己完結型のテストケースがあります。 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
おそらくあなた自身のレンダラーを実装する必要があります。 – mre
@Kylar:私はテストケースを追加しました。 – Gili