在我看来,树选择事件应该发生在焦点事件之后,但事实并非如此。假设您有一个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);
}
}
答案 0 :(得分:2)
让文本字段侦听器调用setSelectionPath()
以选择与文本匹配的节点的TreePath
。 DefaultMutableTreeNode
的方法可用于遍历树。我会在文本字段中使用ActionListener
,但FocusListener
应该有效 - 只是不要依赖TreeSelectionListener
事件到达的顺序。
以下是在默认JTree
中获取“ pizza ”节点的示例:
JTree tree = new JTree();
TreeNode node = (TreeNode) tree.getModel().getRoot();
node = node.getChildAt(2).getChildAt(1);
TreePath pizza = new TreePath(((DefaultMutableTreeNode) node).getPath());
答案 1 :(得分: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);
}
});
}
});
此解决方案解决了我的数据绑定问题。希望它对你也有意义。
答案 2 :(得分:0)
坏消息:当我选择另一个树节点时,我遇到了同样的问题。选择文本字段正在编辑的同一树节点就可以了。
好消息:我发现这个问题真的很老了。看到 http://java.net/jira/browse/BINDING-67