首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现listener?

如何实现listener?
EN

Stack Overflow用户
提问于 2010-03-29 21:09:10
回答 2查看 2.2K关注 0票数 0

我有一些动态的树。现在我需要实现一些功能,每次单击节点时都会发生这些功能。(我的意思是只在节点上点击一次,这“使它变成蓝色”)

**EDIT2:**我使用的是beanTreeView和openide包

如何实现此操作的listener?

编辑添加的伪代码

代码语言:javascript
复制
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中,并在每次节点选择发生变化时更改它。

EN

回答 2

Stack Overflow用户

发布于 2010-03-29 21:43:50

假设您使用的是Swing JTree类,则应该定义一个TreeSelectionListener并将其添加到底层TreeModel中。如果您希望使用ActionListener,则需要编写一些适配器代码来将TreeSelectionEvent转换为ActionEvent(尽管这实际上是毫无意义的)。

示例

代码语言:javascript
复制
/**
 * 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!");
  }
});
票数 1
EN

Stack Overflow用户

发布于 2010-03-29 21:25:00

我假设它是一棵摇摆树。您可以通过使用CustomRenderer组件或TreeSelectionListener接口来实现这一点。

这个link有一个关于如何改变图标,背景等的高级例子的教程。你需要的是一个比这个简单得多的版本。

您将感兴趣的代码是

代码语言:javascript
复制
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 );
            ....
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2538054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档