Java SWT - listening if new children are added to the Composite?

I have a Composite . In SWT, children are added by children, not parents:

 Composite parent = new Composite(shell, SWT.none); Composite child = new Composite(parent, SWT.none); 

This means that inside the parent I do not know how and when the children are added to the parents.

QUESTION:

Inside the parent, I need to know when new children are added to the parent element. Is there a way to register the onChildAddListener method or any add() to override?

+4
source share
2 answers

The only way to add a custom MyComposite and create a custom ChildEvent , as well as the ChildEventListener interface. MyComposite is able to register ChildEvent listeners and fire this event when a Composite child is created.

 import org.eclipse.swt.SWT; import org.eclipse.swt.events.TypedEvent; import org.eclipse.swt.internal.SWTEventListener; import org.eclipse.swt.widgets.*; /* * This example demonstrates the minimum amount of code required * to open an SWT Shell and process the events. */ public class HelloWorld1 { public static void main (String [] args) { Display display = new Display (); Shell shell = new HelloWorld1 ().open (display); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); } public Shell open (Display display) { Shell shell = new Shell (display); MyComposite parent = new MyComposite(shell, SWT.NONE); parent.addChildEventListener(new ChildEventListener() { @Override public void add(ChildEvent e) { System.out.println("Child added."); } }); MyComposite child = new MyComposite(parent, SWT.NONE); // shell.open (); return shell; } } class MyComposite extends Composite { ChildEventListener[] childEventListeners = new ChildEventListener[0]; public MyComposite(Composite parent, int style) { super(parent, style); if (parent instanceof MyComposite){ ((MyComposite)parent).fireChildEvent(new ChildEvent(this)); } } public void addChildEventListener (ChildEventListener listener) { checkWidget(); if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); ChildEventListener[] newChildEventListeners = new ChildEventListener[childEventListeners.length + 1]; System.arraycopy(childEventListeners, 0, newChildEventListeners, 0, childEventListeners.length); childEventListeners = newChildEventListeners; childEventListeners[childEventListeners.length - 1] = listener; } public void removeChildEventListener (ChildEventListener listener) { if (childEventListeners.length == 0) return; int index = -1; for (int i = 0; i < childEventListeners.length; i++) { if (listener == childEventListeners[i]){ index = i; break; } } if (index == -1) return; if (childEventListeners.length == 1) { childEventListeners = new ChildEventListener[0]; return; } ChildEventListener[] newChildEventListeners = new ChildEventListener[childEventListeners.length - 1]; System.arraycopy (childEventListeners, 0, newChildEventListeners, 0, index); System.arraycopy (childEventListeners, index + 1, newChildEventListeners, index, childEventListeners.length - index - 1); childEventListeners = newChildEventListeners; } public void fireChildEvent(ChildEvent event){ for (int i = 0; i < childEventListeners.length; i++) { childEventListeners[i].add (event); } } } interface ChildEventListener extends SWTEventListener { public void add(ChildEvent e); } class ChildEvent extends TypedEvent { public ChildEvent(Widget widget) { super(widget); // TODO Auto-generated constructor stub } } 
+4
source

The goal that I wanted to learn about the child addition is to lay out children (adding LayoutData for example GridData ) when a child is added to a child element that is laid out using a specific layout (for example, GridLayout ).

Since it is impossible to add layouts to the add-on, check their layout each time the widget is resized:

  /* * To make the forms fill the group - laying out the children is necessary. * Unfortunately it is not possible to listen for children addition, in order to layout the children addition automatically. * This means that the user will have to remember to layout the children, which is a nogo. * * Solution: * istead of adding right layout on child addition - check if there are new children every time the widget is resized. * if a widget without layoutData is found (new child not layed out) - add a layout */ this.addControlListener(new ControlAdapter() { @Override public void controlResized(ControlEvent e) { layoutChildren(); } }); } private void layoutChildren(){ for(Control child:getChildren()){ if(child.getLayoutData() == null){ child.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); } } } public void addToGroup(Composite child){ child.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); } 
+1
source

All Articles