2

MouseListenerアイテムのダブルクリックを検出するために を使用していJTreeます。それJTreeは にありJScrollPaneます。ダブルクリック (a MouseEvent) を検出すると、クリックした場所のパスを から取得しますJTree。ほとんどの場合、これで問題なく動作します。

子を持つ (折りたたまれた) ノードをダブルクリックすると、ノードが展開され、スクロール ペインが下にスクロールします。クリック位置からツリー パスを取得しようとするとJTree、現在の (スクロールされた) ビューが表示され、クリック位置が前のビュー (スクロールされていない) を参照するため、間違ったアイテムが返されます。

これを修正する方法を知っている人はいますか?以下に、問題を示す例を添付します。


package test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

public class TestMain extends JDialog implements MouseListener {

    protected final JTree tree;

    public TestMain() {
        tree = new JTree(getRootNode());
        tree.addMouseListener(this);

        JScrollPane pane = new JScrollPane(tree);
        pane.setPreferredSize(new Dimension(250, 300));

        getContentPane().add(pane, BorderLayout.CENTER);
        pack();
    }

    private TreeNode getRootNode() {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");

        for (int i = 0; i < 10; i++) {
            root.add(new DefaultMutableTreeNode("Node " + i));
        }

        DefaultMutableTreeNode sub = new DefaultMutableTreeNode("Sub");
        root.add(sub);

        for (int i = 0; i < 10; i++) {
            sub.add(new DefaultMutableTreeNode("Sub " + i));
        }

        return root;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) {
            TreePath path = tree.getPathForLocation(e.getX(), e.getY());
            if (path != null) {
                System.out.println(path.getLastPathComponent().toString());
            }
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    public static void main(String[] args) {
        JDialog dialog = new TestMain();
        dialog.setVisible(true);
    }
}
4

1 に答える 1

2

JTree.getSelectionPath().getLastPathComponent()スクロールしても変わらないのでおすすめです。

于 2012-11-16T15:02:50.627 に答える