1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellRenderer;
public class Main {
private static int selRow = -1;
/**
* Ce délégué a juste pour tâche de fournir un composant pour le rendu de
* chaque cellule. Dans notre exemple, si la cellule n'est pas avec sous
* la souris, on retourne le composant de rendu du DefaultTreeCellRenderer.
*/
private static class MyTreeCellRenderer extends JPanel implements TreeCellRenderer {
private TreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
public MyTreeCellRenderer() {
JButton button = new JButton("clic1");
setLayout(new BorderLayout());
add(button);
}
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
if (row == selRow) {
return this;
} else {
Component component = defaultRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
return component;
}
}
}
/**
* Un TreeCellRenderer ne fait que du rendu et le bouton qu'il dessine n'est
* pas interactif. On est donc obligé d'ajouter aussi un TreeCellEditor, même
* si le contenu de la cellule n'est pas réellement modifié. Il s'agit plus
* d'un effet de bord en fait.
*/
private static class MyTreeCellEditor extends JPanel implements TreeCellEditor {
private JButton button;
private List<CellEditorListener> listeners = new ArrayList<CellEditorListener>();
private Object value;
public MyTreeCellEditor() {
button = new JButton("clic2");
setLayout(new BorderLayout());
add(button);
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
fireEditingStopped();
}
});
}
public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
this.value = node.getUserObject();
return this;
}
public Object getCellEditorValue() {
return value;
}
public boolean isCellEditable(EventObject anEvent) {
return true;
}
public boolean shouldSelectCell(EventObject anEvent) {
return false;
}
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
public void cancelCellEditing() {
fireEditingCanceled();
}
public void addCellEditorListener(CellEditorListener l) {
listeners.add(l);
}
public void removeCellEditorListener(CellEditorListener l) {
listeners.remove(l);
}
private void fireEditingCanceled() {
final ArrayList<CellEditorListener> copy =
new ArrayList<CellEditorListener>(listeners);
for (final CellEditorListener ecouteur : copy) {
ecouteur.editingCanceled(new ChangeEvent(button));
}
}
private void fireEditingStopped() {
final ArrayList<CellEditorListener> copy =
new ArrayList<CellEditorListener>(listeners);
for (final CellEditorListener ecouteur : copy) {
ecouteur.editingStopped(new ChangeEvent(button));
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
final NewJFrame frame = new NewJFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.tree.setCellRenderer(new MyTreeCellRenderer());
frame.tree.setCellEditor(new MyTreeCellEditor());
frame.tree.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
selRow = frame.tree.getRowForLocation(e.getX(), e.getY());
frame.tree.repaint();
}
});
frame.tree.setEditable(true);
frame.setVisible(true);
}
});
}
} |
Partager