2012-11-16 60 views
2

我正在使用MouseListener來檢測JTree項目上的雙擊。 JTree位於JScrollPane。當我檢測到雙擊(一個MouseEvent)時,我從JTree獲得點擊位置的路徑。大多數時候,這工作正常。在JTree中使用MouseListener

現在,如果我雙擊帶有子節點的(摺疊)節點,該節點將展開並因此滾動窗格向下滾動。當我嘗試從點擊位置獲取樹形路徑時,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); 
    } 
} 
+3

*「我使用'MouseListener'來檢測'JTree'項目的雙擊。」*爲什麼?這麼做有什麼意義或好處? –

+0

強調安德魯的評論:有幾個選項(包括@dacwe給出的答案) - 選擇哪個完全取決於你想實現什麼 – kleopatra

+0

@AndrewThompson該樹是選擇對話框的一部分。而不是點擊'選擇'按鈕,用戶應該能夠選擇一個項目,並通過雙擊該項目來關閉對話框。 –

回答

2

我會建議你使用JTree.getSelectionPath().getLastPathComponent(),因爲它不會改變滾動。

+0

你是對的,這解決了我的問題,並完全按照我的要求工作。謝謝。 –