SWT Kind-Komponenten ?

Bullitt

Mitglied
Hallo!
Hier das nächste SWT-Problem.
Wie finde ich z.B. bei einer Shell die Kindkomponenten heraus und dann wieder die Kindkomponenten der Kindkomponenten? Also ich kenne das von Swing, da kann man sich mit z.B. frame.getComponents alle Komponenten, die im Frame sind, zurückgeben lassen und von diesen wieder die Komponenten. So kann man sich mit einer Rekursion quasi einen Komponentenbaum erstellen.
Gibts das bei SWT auch? Wenn man eine neue GUI-Komponente erstellt, z.B. einen Button, gibt man ja im Konstruktor die Eltern-Komponente an, ich bräuchte aber die umgekehrte Richtung.
Ich finde dazu einfach keine Infos. Für Hilfe wäre ich dankbar.
Grüße,
Bullitt
 
Hallo!

Hier mal ein kleiner Hack:

Code:
import java.lang.reflect.Field;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

/**
 * @author      Darimont<br>
 * @version     1.0<br>
 * Date of creation:  31.03.2004<br>
 * File:         SWTTest.java<br>
 * Modifier:     Darimont<br>
 * Revision:     Revision<br>
 * State:        Germany<br>
 */

public class SWTTest {

	public static void main(String[] args) {
		new SWTTest().doIt();
	}
	/**
	 * 
	 */
	private void doIt() {
		// TODO Auto-generated method stub
		final Display display = new Display();
		final Shell shell = new Shell(display);
		shell.setText("SWTTest");

		shell.setLayout(new FillLayout());
		Composite comp = new Composite(shell, SWT.NONE);
		comp.setLayout(new FillLayout());

		Label label = new Label(comp, SWT.BORDER);
		label.setText("TestLabel");

		Button b = new Button(comp, SWT.PUSH);
		b.setText("Button");

		b.addMouseListener(new MouseAdapter() {
			public void mouseDown(MouseEvent evt) {
				System.out.println("Get all Components...:");
				Class clazz = null;
				try {
					clazz =
						Class.forName("org.eclipse.swt.widgets.WidgetTable");

					Field[] fields = clazz.getDeclaredFields();
					for (int i = 0; i < fields.length; i++) {
						System.out.println(fields[i].getName());

						if (fields[i].getName().equals("ControlTable")) {
							//System.out.println("Found!");
							fields[i].setAccessible(true);
							Control[] controls =
								(Control[]) fields[i].get(null);
							System.out.println(controls.length);
							for (int j = 0; j < controls.length; j++) {
								if (controls[j] != null)
									System.out.println(controls[j]);
							}
							System.out.println("...finished");
						}

					}

				} catch (SecurityException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}
		});

		shell.setSize(320, 240);

		shell.open();

		while (!shell.isDisposed())
			if (!display.readAndDispatch())
				display.sleep();

	}

}

Gruß Tom
 
Danke

Hallo!
Ja, danke, das hilft mir schon weiter.
Wo gibts eigentlich solche Infos über die internen SWT-Geschichten? Ich hab schon ziemlich lange rumgegoogelt aber nix dazu gefunden. Gibts da ein paar gute Seiten im Web?
Dann noch was. Kann man eigentlich GUI-Komponenten einen eindeutigen internen Namen geben, also unabhängig vom Label oder sonstiges? Bei Swing gibts da die setName()-Methode, hab ich aber bei SWT noch nicht gefunden.
Danke nochmal...
 
Hallo!

Schau dir einfach den SWT -Source an ...
findest du im %ECLIPSE_HOME%/PLUGINS/org.eclipse.platform.win32.source_X.X.X/src/org.eclipse.swt.win32_X.X.X\ws\win32
 
bei mir funktioniert dein Beispiel leider nicht.

In der Konsole steht:

Code:
Get all Components...:
java.lang.ClassNotFoundException: org.eclipse.swt.widgets.WidgetTable
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at SWTTest$1.mouseDown(SWTTest.java:56)
	at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:133)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:843)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3080)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2713)
	at SWTTest.doIt(SWTTest.java:102)
	at SWTTest.main(SWTTest.java:29)



Weißt du, woran das liegen könnte?
 
Zurück