Как реализовать слушателя?
У меня есть динамическое дерево. И теперь мне нужно реализовать некоторые функции, которые происходят каждый раз, когда просто нажимаете на узел. (Я имею в виду только один щелчок по узлу, который "делает его синим")
** 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 ответа
Предполагая, что вы используете Swing JTree
класс вы должны определить TreeSelectionListener
и добавить его в основной TreeModel
, Если вы хотите использовать ActionListener
вместо этого вам нужно написать код адаптера для перевода TreeSelectionEvent
с в ActionEvent
с (хотя это на самом деле было бы довольно бессмысленно).
пример
/**
* 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!");
}
});
Я предполагаю, что это 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 );
....
}