Y a-t-il un moyen pour un JComponent
d'obtenir une notification des modifications ajoutées/supprimées dans sa hiérarchie de composants descendants?Écoute des modifications de la hiérarchie des composants descendants
Par exemple, dans le code ci-dessous, il y a un bouton addChild
qui ajoutera un nouvel enfant JPanel
à la racine ou au dernier panneau ajouté. Je voudrais que le panneau racine reçoive une notification de ceci. Un peu comme un HierarchyListener
mais l'inverse ou un ContainerListener
qui a écouté pour plus que les enfants immédiats.
public class DecendantHierarchyListening extends JFrame {
private final JPanel root = createChildPanel(null);
public JPanel leafComponent = root;
public DecendantHierarchyListening() {
super("title");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent buttons = new JPanel();
JPanel panel = new JPanel(new BorderLayout());
panel.add(createAddChildButton(buttons), BorderLayout.NORTH);
panel.add(root, BorderLayout.CENTER);
getContentPane().add(panel);
}
private Button createAddChildButton(JComponent buttons) {
Button button = new Button("AddChild");
buttons.add(button);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
leafComponent = (JPanel) leafComponent
.add(createChildPanel(leafComponent));
DecendantHierarchyListening.this.invalidate();
DecendantHierarchyListening.this.validate();
DecendantHierarchyListening.this.repaint();
}
});
return button;
}
public static JPanel createChildPanel(Container parent) {
Color[] colors = new Color[] { Color.RED, Color.BLUE, Color.GREEN };
JPanel panel = new JPanel(new BorderLayout());
panel.setPreferredSize(new Dimension(200, 200));
Color color;
if (parent == null) {
color = Color.GREEN;
} else {
int distance = 1;
parent = parent.getParent();
while (parent != null) {
distance++;
parent = parent.getParent();
}
color = colors[distance % colors.length];
}
panel.setBorder(BorderFactory.createLineBorder(color, 2));
return panel;
}
public static void runDemo() {
JFrame f = new DecendantHeirarchyListening();
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
DecendantHierarchyListening.runDemo();
}
}
Je pense que vous pouvez contourner ce problème assez facilement. Pourquoi voudriez-vous même écouter des événements qui n'affectent pas un composant particulier? Vous pourriez, par exemple, réutiliser un ContainerListener pour tous les conteneurs à partir desquels vous souhaitez recevoir des notifications. L'ajout d'un enfant à l'enfant d'un composant ne l'affecte pas techniquement (sauf si vous faites un ajustement au premier enfant). C'est une autre approche: utilisez les composants dans le "milieu" de la hiérarchie pour notifier vos composants de niveau supérieur. – J4v4