我正在使用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);
}
}
*「我使用'MouseListener'來檢測'JTree'項目的雙擊。」*爲什麼?這麼做有什麼意義或好處? –
強調安德魯的評論:有幾個選項(包括@dacwe給出的答案) - 選擇哪個完全取決於你想實現什麼 – kleopatra
@AndrewThompson該樹是選擇對話框的一部分。而不是點擊'選擇'按鈕,用戶應該能夠選擇一個項目,並通過雙擊該項目來關閉對話框。 –