как реализовать слушателя? - PullRequest
0 голосов
/ 29 марта 2010

У меня есть динамическое дерево. И теперь мне нужно реализовать некоторые функции, которые происходят каждый раз, когда просто нажимаете на узел. (Я имею в виду только один щелчок по узлу, который «делает его синим»)

** EDIT2: ** Я использую beanTreeView и пакет openide

Как реализовать слушатель этого действия?

РЕДАКТИРОВАТЬ - добавлен псевдокод

public class MyNode extends AbstractNode{ //openide package
   private String name;

   public MyNode(String nameOfNode){
       super (new Children.LEAF);
       name = nameOfNode;
   }
   ....
   ....
}

public class IWantNameOfSelectedNode extends JPanel{   
    private JLabel jLnameOfNode;

   public IWantNameOfSelectedNode(){
       jLnameOfNode.setText("wiating for node selection");
   }

Теперь мне нужно поместить имя выбранного узла в jLabel и менять его каждый раз, когда изменяется выбор узла.

Ответы [ 2 ]

1 голос
/ 29 марта 2010

Предполагая, что вы используете класс Swing JTree, вы должны определить TreeSelectionListener и добавить его в базовый TreeModel. Если вы хотите использовать ActionListener вместо этого, вам понадобится написать код адаптера , чтобы перевести TreeSelectionEvent s в ActionEvent s (хотя на самом деле это было бы довольно бессмысленно).

Пример

/**
 * Adapter class responsible for translating TreeSelectionEvents into
 * ActionEvents.
 */
public class TreeSelectionAdapter implements TreeSelectionListener {
  private final AtomicInteger nextId = new AtomicInteger(0);
  // Prefer CopyOnWriteArrayList to avoid ConcurrentModificationException if an
  // ActionListener removes itself as a listener during notification.
  private final CopyOnWriteArrayList<ActionListener> listeners;

  public TreeSelectionAdapter() {
    this.listeners = new CopyOnWriteArrayList<ActionListener();
  }

  public void addActionListener(ActionListener l) {
    this.listeners.add(l);
  }

  public void removeActionListener(ActionListener l) {
    this.listeners.remove(l);
  }

  public void valueChanged(TreeSelectionEvent evt) {
    // Create new ActionEvent which corresponds to incoming TreeSelectionEvent
    // and notify registered ActionListeners.
    ActionEvent aEvt = new ActionEvent(evt.getSource(),
      nextId.getAndIncrement(), "selectionChanged");

    for (ActionListener listener : listeners) {
      listener.actionPerformed(listener);
    }
  }
}

TreeNode rootNode = createTreeModel(); // Create custom model
JTree tree = new JTree(rootNode); // Install model into JTree.

// Add adapter listener to underlying selection model.
tree.getSelectionModel().addTreeSelectionListener(adapter);

// Register ActionListener with adapter listener.
adapter.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
    System.err.println("Selection has changed in some way!");
  }
});
0 голосов
/ 29 марта 2010

Я предполагаю, что это Swing Tree. Этого можно добиться, используя компонент CustomRenderer или интерфейс TreeSelectionListener.

Эта ссылка содержит учебник для расширенного примера того, как изменять значки, фоны и т. Д. Вам нужна гораздо более простая версия, чем эта.

Код, который вас заинтересует:

public Component getTreeCellRendererComponent( JTree tree,
                    Object value, boolean bSelected, boolean bExpanded,
                            boolean bLeaf, int iRow, boolean bHasFocus )
    {
        // Find out which node we are rendering and get its text
        DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
        String  labelText = (String)node.getUserObject();

        this.bSelected = bSelected;

        // Set the correct foreground color
        if( !bSelected )
            setForeground( Color.black );
        else
            setForeground( Color.white );
            ....
    }
...