3

在我看来,树选择事件应该在焦点事件之后发生,但事实并非如此。假设您有一个 JTree 和一个 JTextField,其中 JTextField 由树中选择的内容填充。当用户更改文本字段时,失去焦点时,您可以从文本字段更新树。但是,在焦点丢失在文本字段上之前,树选择已更改。这是不正确的,对吧?有任何想法吗?这是一些示例代码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Focus extends JFrame
{
 public static void main(String[] args)
 {
  Focus f = new Focus();
  f.setLocationRelativeTo(null);
  f.setVisible(true);
 }

 public Focus()
 {
  Container cp = getContentPane();
  cp.setLayout(new BorderLayout());

  final JTextArea ta = new JTextArea(5, 10);
  cp.add(new JScrollPane(ta), BorderLayout.SOUTH);

  JSplitPane sp = new JSplitPane();
  cp.add(sp, BorderLayout.CENTER);

  JTree t = new JTree();
  t.addTreeSelectionListener(new TreeSelectionListener()
  {
   public void valueChanged(TreeSelectionEvent tse)
   {
    ta.append("Tree Selection changed\n");
   }
  });
  t.addFocusListener(new FocusListener()
  {
   public void focusGained(FocusEvent fe)
   {
    ta.append("Tree focus gained\n");
   }
   public void focusLost(FocusEvent fe)
   {
    ta.append("Tree focus lost\n");
   }
  });

  sp.setLeftComponent(new JScrollPane(t));
  JTextField f = new JTextField(10);
  sp.setRightComponent(f);

  pack();

  f.addFocusListener(new FocusListener()
  {
   public void focusGained(FocusEvent fe)
   {
    ta.append("Text field focus gained\n");
   }
    public void focusLost(FocusEvent fe)
{
    ta.append("Text field focus lost\n");
   }
  });
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
}
4

3 回答 3

2

让您的文本字段侦听器调用setSelectionPath()以选择TreePath与文本匹配的节点。的方法DefaultMutableTreeNode可用于遍历树。我会ActionListener在文本字段上使用 an ,但 aFocusListener应该可以工作——只是不要依赖TreeSelectionListener事件到达的顺序。

下面是在默认情况下获取“披萨”节点的示例JTree

JTree tree = new JTree();
TreeNode node = (TreeNode) tree.getModel().getRoot();
node = node.getChildAt(2).getChildAt(1);
TreePath pizza = new TreePath(((DefaultMutableTreeNode) node).getPath());
于 2010-04-28T01:25:12.227 回答
1

更好的消息:我尝试将树选择逻辑推迟到 EDT 的末尾,这将在文本字段的焦点移出后执行!

JTree t = new JTree();
t.addTreeSelectionListener(new TreeSelectionListener()
{
   public void valueChanged(TreeSelectionEvent tse)
   {
       ta.append("Tree Selection changed\n");
       SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                logicInEDT...(tse);
            }
       });
    }
});

该解决方案解决了我的数据绑定问题。希望它对你也有意义。

于 2012-06-21T06:07:11.453 回答
0

坏消息:当我选择另一个树节点时,我遇到了同样的问题。选择您的文本字段正在编辑的同一个树节点就可以了。

好消息:我发现这个问题真的很老了。见 http://java.net/jira/browse/BINDING-67

于 2012-06-20T00:49:09.203 回答