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テキスト フィールドで を使用しますが、機能するはずです。ただし、イベントが到着するFocusListener順序に依存しないでください。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 に答える