SWT pack() von org.eclipse.swt.widgets.Control

Status
Nicht offen für weitere Antworten.

mrbela

Bekanntes Mitglied
Hallo Javafreunde,

ich bin mittlerweile seit einiger Zeit an einem Problem dran, dass ich noch nicht lösen konnte. Da ich eine Swing Komponente in einer SWT Shell eingebettet habe (Eclipse RCP-Anwendung), arbeite ich mit dem von Eclipse hierfür entwickelten. Das Ganze sieht in etwa so aus:

"
final JComponent component = helper.createComponent();

SwingControl c = new SwingControl(dialog, SWT.NONE) {

@Override
protected JComponent createSwingComponent() {
return component;
}
public org.eclipse.swt.widgets.Composite getLayoutAncestor() {
return dialog;
}
};
"

Möchte ich nun die Shell mit der Methode pack() "packen", so bekommt die Shell nicht die richtige Größe, da ich denke, dass sie nicht mit der JComponent zusammen arbeiten kann, somit nicht an ihre preferedSize dran kommt.

Also versuche ich gerade eine UtilityKlasse zu schreiben, mit deren Hilfe ich meine Shell "packen" will à la:

"
UtilityClassComponentPack.pack(Shell)
"

Zu diesem Zwecke habe ich mir mal die pack() angeschaut, die in der Klasse Control liegt:

"
public void pack () {
checkWidget ();
pack (true);
}
"

Das checkWidget() spielt meines Erachtens keine Rolle für die Größe, also pack(true):

"
public void pack (boolean changed) {
checkWidget ();
setSize (computeSize (SWT.DEFAULT, SWT.DEFAULT, changed));
}
"

und nun computeSize(...):

"
public Point computeSize (int wHint, int hHint, boolean changed) {
checkWidget ();
int width = DEFAULT_WIDTH;
int height = DEFAULT_HEIGHT;
if (wHint != SWT.DEFAULT) width = wHint;
if (hHint != SWT.DEFAULT) height = hHint;
int border = getBorderWidth ();
width += border * 2;
height += border * 2;
return new Point (width, height);
}
"

Die Konstante DEFAULT_WIDTH, bzw. HEIGHT sind in der Widget-Klasse mit

"
static final int DEFAULT_WIDTH = 64;
static final int DEFAULT_HEIGHT = 64;
"

angegeben.

Was ich jetzt nicht verstehe: Woher holt sich denn die pack()-Methode die tatsächlichen Größen der Komponenten, die verbaut sind in dem Control. Anscheinend, zumindest meiner Logik nach, bewirkt setSize(computeSize(...)) nichts anderes wie setSize(64,64); dem ist aber nicht so, da die pack() ja unter normalen Umständen problemlos funktioniert.

Kann mir da einer helfen?? Ich denke, es ist nicht so einfach, aber ich würde mich tierisch über ne Antwort freuen!

Vielen Dank,

armin
 

Wildcard

Top Contributor
Warum rufst du denn nicht einfach setSize auf mit der Preferred Size der Swing Component? Wenn das nicht geht, weil noch andere Elemente im Dialog sind, dann setz dem Composite einen entsprechenden Layout Hint.
Java:
final JComponent component = helper.createComponent();
Das sieht übrigens gefährlich aus, da du höchstwahrscheinlich im falschen Thread bist um Swing components zu erzeugen (dafür ist ja die Methode createSwingComponent)
 

mrbela

Bekanntes Mitglied
Servus!

Du siehst es richtig, dass ich in dem Dialog mehrere Componenten habe und dsa daher so nicht geht. Aber wie meinst Du das mit dem "dann setz dem Composite einen entsprechenden Layout Hint." ??

Kannst Du mir mal n kleines Beispiel bringen, das wäre super nett von Dir.

Mit der createSwingComponent bin ich mir bewusst. Es sieht so aus, dass ich diese JComponent aus

final JComponent component = helper.createComponent();

durch die createSwingComponent returne. Somit habe ich daran gedacht.

Ich danke Dir herzlich für Deine Hilfe!
 

Wildcard

Top Contributor
final JComponent component = helper.createComponent();

durch die createSwingComponent returne. Somit habe ich daran gedacht.
Nein, denn das helper.createComponent() wird schon ausgeführt wenn die Klasse instanziert wird und das passiert im falschen Thread. Deadlockgefahr.

Aber wie meinst Du das mit dem "dann setz dem Composite einen entsprechenden Layout Hint." ??
Nehmen wir mal an du hast ein GridLayout. Was hindert dich daran dem Composte GridData zu setzen mit einem Hint entsprechend der PreferredSize der SwingComponent?
GridDataFactory (Eclipse Platform API Specification)
 

mrbela

Bekanntes Mitglied
mh, danke für Deine Hilfe!

Mir ist das immer noch nciht ganz klar, vorallem kriege ich diese Frage nicht geklärt, weshalb ich die helper.createComponent() ausserhalb gemacht habe. Dass das so nicht geht, gebe ich Dir recht:

SwingControl c = new SwingControl(dialog, SWT.NONE) {

@Override
protected JComponent createSwingComponent() {
return helper.createComponent();
}
public org.eclipse.swt.widgets.Composite getLayoutAncestor() {
return dialog;
}
};

JComponent p = c.getSwingComponent();

Wenn ich das so mache, was ja eigtl der korrekte Weg wäre, dann ist p == null. Das habe ich auch mit dem Debugger getestet.. Ich weiß nicht wie ich das beheben kann, bzw. wann die SwingControl c genau instanziiert wird.

Eine weitere Frage bzgl. der GridData.. Eine Methode à la p.setLayoutData(new gridData) gibt es nicht... wie kann ich dann bezwecken, dass ich die JComponent p in die GridData einbette?

Und verstehe ich Deine Idee richtig, dass wenn ich die GridData gesetzt habe ich den Dialog mit pack() "packen" kann? Denn mir ist nachwievor ein geheimnis woher die pack-Methode die Größe der jeweiligen Komponenten bekommt. Wahrscheinlich vom LayoutManager, wobei ich die Codestelle in der Control-class, in der ja die Methode liegt nicht finden kann, in der sie mit dem LayoutManager zusammen arbeitet..

herzlichen Dank!!
 

Wildcard

Top Contributor
Du musst dir darüber klar werden das du es nun mit mindestens zwei Threads zu tun hast. Den Swing Event Dispatcher Thread und den SWT read and dispatch thread.
createSwingComponent wird von Albireo asynchron (das ist wichtig) im Swing EDT aufgerufen. Daher ist zum Zeipunkt X nach instanzierung dein 'p' noch null, weil der Swing Thread die createSwingComponent noch nicht aufgerufen hat.
Eine weitere Frage bzgl. der GridData.. Eine Methode à la p.setLayoutData(new gridData) gibt es nicht... wie kann ich dann bezwecken, dass ich die JComponent p in die GridData einbette?
Nicht auf der Swing Component, das bringt nichts. Auf dem Composite in dem die Swing Component liegen soll.

Und verstehe ich Deine Idee richtig, dass wenn ich die GridData gesetzt habe ich den Dialog mit pack() "packen" kann? Denn mir ist nachwievor ein geheimnis woher die pack-Methode die Größe der jeweiligen Komponenten bekommt. Wahrscheinlich vom LayoutManager, wobei ich die Codestelle in der Control-class, in der ja die Methode liegt nicht finden kann, in der sie mit dem LayoutManager zusammen arbeitet..
Pack macht nichts anderes als beim LayoutManager nachzufragen wie groß das Zeug denn werden soll. Da dein SWT.EMBEDDED composite diese Information erstmal nicht von sich aus schlüssig beantworten kann, musst du mit einem LayoutHint nachhelfen.
 

mrbela

Bekanntes Mitglied
mh, ich weiß worauf Du hinaus willst. Aber ich komme nicht ganz drauf dies umzusetzen.

Ich habe ja ein GridLayout, das ich in diesem Dialog benutze. Nun muss ich ein Composite erzeugen, dass die Maße von meiner SwingComponente hat?? Aber an die Maße komm ich ja nicht dran, da getSwingComponent() zu diesem Zeitpunkt ja noch null ist. Wie soll ich dann die Maße bekommen, um zu wissen, wie groß das sein muss.

Zweite Frage: Wie bette ich ein Composite in ein GridLayout ein, oder passiert das automatisch sobald ich das in dem Dialog angelegt habe, dass das GridLayout davon dann mitbekommt.

ich weiß nur eins: das SWT, vorallem gekoppelt mit Swing, echt blöd ist!!

danke für die hilfe!!
 

mrbela

Bekanntes Mitglied
hier mal meine Klasse:

Java:
public class VPreferencesDailogRCP extends Dialog {

	private VPreferencesDialogHelper helper;
	
	public VPreferencesDailogRCP(Shell parent) {
		super(parent);
	}

	public void show() {
		final Shell parent = getParent();
		final Shell dialog = new Shell(parent, SWT.SHELL_TRIM);
		
		// edit text
		dialog.setText("Dialog");
		
		GridLayout gl = new GridLayout();				
		dialog.setLayout(gl);
		
		Composite c = new Composite(dialog, SWT.EMBEDDED);
		

		helper = new VPreferencesDialogHelper();
//		final JComponent component = helper.createComponent();
								
		SwingControl c = new SwingControl(dialog, SWT.NONE) {
			
			@Override
			protected JComponent createSwingComponent() {
				return helper.createComponent();
			}
			public org.eclipse.swt.widgets.Composite getLayoutAncestor() {
				return dialog;
			}
		};
		
		JComponent p = c.getSwingComponent();
				
		Button okButton = new Button(dialog, SWT.PUSH);
		okButton.setText("Ok");
		okButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				dialog.dispose();
			}
		});
		
//		windowsclosewithsave etc.
//		look VPreferncesDialog
		
		Button cancelButton = new Button(dialog, SWT.PUSH);
		cancelButton.setText("Cancel");
		cancelButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				dialog.dispose();
			}
		});
					
//		Object[] package_x = {component};
//		Object[] package_y = {component, okButton};
		
		
//		UtilityClassComponentPack.pack(package_x, package_y, dialog);
		
		dialog.addListener (SWT.Resize,  new Listener () {
		    public void handleEvent (Event e) {
		      Rectangle rect = dialog.getClientArea ();
		      System.out.println(rect);
		    }
		  });
		
		
		dialog.pack();
		
		dialog.setVisible(true);
	}
}
 
Zuletzt bearbeitet:

Wildcard

Top Contributor
Solange du die Swing Component nach den SWT Controls erzeugst, kannst du nicht wissen wie groß sie sein soll, das ist richtig. Du könntest aber einen reasonable Default setzen und später (wenn der Swing Thread durch ist) 'nachbessern'
Wie bette ich ein Composite in ein GridLayout ein
Bin nicht sicher ob ich die Frage verstehe. Ein Container hat ein Layout. Erstellt man ein Child (zB ein Composite) auf diesem Parent, dann positioniert der LayoutManager des Containers das Child (war das die Frage?).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Swing pack() Problem mit Taskleiste AWT, Swing, JavaFX & SWT 4
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
H AWT setSize()/setBounds() und pack() kombinieren!? AWT, Swing, JavaFX & SWT 3
W pack() lässt Ränder AWT, Swing, JavaFX & SWT 3
N SWT Text pack() macht Text zu klein AWT, Swing, JavaFX & SWT 2
C JFrame und pack() / validate() AWT, Swing, JavaFX & SWT 3
M pack() awt funktioniert falsch AWT, Swing, JavaFX & SWT 3
G pack() ? AWT, Swing, JavaFX & SWT 2
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
Encera Java FX im Eclipse-Marketplace nichtmehr auffindbar AWT, Swing, JavaFX & SWT 6
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
D Verschieden Scenen ansprechen mit dem Scene Builder und JavaFX (Eclipse) AWT, Swing, JavaFX & SWT 16
G javafx build.fxbuild in eclipse und ANT AWT, Swing, JavaFX & SWT 9
D runnable Jar mit Javafx erstellen(Eclipse) AWT, Swing, JavaFX & SWT 10
C JavaFX mit CSS in Eclipse AWT, Swing, JavaFX & SWT 2
S Swing Schrift sehr klein Ubuntu/eclipse AWT, Swing, JavaFX & SWT 18
A Eclipse Windowbuilder Frameanzeige falsch AWT, Swing, JavaFX & SWT 3
C JavaFX Veränderungen in Scenebuilder in Eclipse als Quellcode anzeigen lassen AWT, Swing, JavaFX & SWT 11
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
VPChief Eclipse: Projekt mit src ordner exportieren. AWT, Swing, JavaFX & SWT 76
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
F Kein JavaFX mehr im Eclipse Wizard AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
B Swing Eclipse is running under 0, but this Java project has a 1.6 Java compliance level, so WindowBuilder AWT, Swing, JavaFX & SWT 2
F FXML Datei aus dem SceneBuilder in Eclipse aufrufen AWT, Swing, JavaFX & SWT 1
R JavaFX lässt sich nicht in Eclipse einbinden AWT, Swing, JavaFX & SWT 4
S download WindowBuilder Pro Eclipse AWT, Swing, JavaFX & SWT 1
N Eclipse - GUI - MacBook - Buttonsichtbarkeit beim Anlegen/Erstellen AWT, Swing, JavaFX & SWT 14
I JAVAFX - CSS - automatische Property- und Methoden-Vorlagen in Eclipse AWT, Swing, JavaFX & SWT 17
I JAVA 8, JAVAFX und Eclipse – muss Eclipse extra eingerichtet werden? AWT, Swing, JavaFX & SWT 9
Z ProgressBar in Eclipse mit Wizard page? AWT, Swing, JavaFX & SWT 1
C Applet Applet funktioniert in Eclipse aber nicht in Browser AWT, Swing, JavaFX & SWT 1
J JavaFX Anwendung läuft in eclipse, nicht aber exportiert AWT, Swing, JavaFX & SWT 2
R Eclipse GUI Programmieren AWT, Swing, JavaFX & SWT 8
P Ubuntu - Eclipse - Windowbuilder AWT, Swing, JavaFX & SWT 0
M 3D-Grafik Mac Java 3D in Eclipse Exception AWT, Swing, JavaFX & SWT 0
O Eclipse Hitbox(en) AWT, Swing, JavaFX & SWT 6
D Robot Programm mit Escape abbrechen (aus Eclipse heraus) AWT, Swing, JavaFX & SWT 2
M LookAndFeel Oberfläche wie Eclipse/Business Objects oder Solvatio AWT, Swing, JavaFX & SWT 2
N Programm läuft perfekt in Eclipse aber nicht in .JAR AWT, Swing, JavaFX & SWT 3
T SWT benötige den richtigen SWT style --> org.eclipse.swt.SWT.* AWT, Swing, JavaFX & SWT 2
C Eclipse Filter-Muster AWT, Swing, JavaFX & SWT 2
H org.eclipse.swt.widgets.Scale MouseRelease listener AWT, Swing, JavaFX & SWT 1
H org.eclipse.swt.Slider ohne Buttons AWT, Swing, JavaFX & SWT 1
H org.eclipse.swt.widgets.Slider und negative Werte AWT, Swing, JavaFX & SWT 3
L Eclipse Fehler besser zu verstehen!!! AWT, Swing, JavaFX & SWT 4
B JAVAFX und CSS Datei in Eclipse AWT, Swing, JavaFX & SWT 4
M Swing in Eclipse AWT, Swing, JavaFX & SWT 1
A Eclipse Windowbuilder AWT, Swing, JavaFX & SWT 2
B JavaFX FXML - Eclipse einrichten AWT, Swing, JavaFX & SWT 2
G Eclipse: Design Tab wird nicht mehr angezeigt AWT, Swing, JavaFX & SWT 4
S Swing SplitButton wie in Eclipse AWT, Swing, JavaFX & SWT 5
P JApplet verhält sich im Browser anders als im Eclipse (AppletViewer) AWT, Swing, JavaFX & SWT 3
A Kinect und Eclipse AWT, Swing, JavaFX & SWT 2
K Eclipse Layout (Gimp Layout, Tiled Layout...) AWT, Swing, JavaFX & SWT 4
J SWING - Programm ohne Eclipse etc. starten AWT, Swing, JavaFX & SWT 7
J SWT in eclipse importieren AWT, Swing, JavaFX & SWT 11
K Eclipse-Java Export/Import mit Oberfläche AWT, Swing, JavaFX & SWT 2
T eclipse.swt.widgets saveState NPE AWT, Swing, JavaFX & SWT 5
V Laden einer Bitmap / Eclipse-Problem? AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Punkt in Eclipse AWT, Swing, JavaFX & SWT 4
S JavaFX 2.0 in Eclipse RAP??? AWT, Swing, JavaFX & SWT 6
M Eclipse-Platform Combo-Binding für User-Einträge AWT, Swing, JavaFX & SWT 9
D VE in Eclipse mag einfach nicht funktionieren AWT, Swing, JavaFX & SWT 5
S FileFilter Problem Eclipse AWT, Swing, JavaFX & SWT 7
V Eclipse View Right-Click Menu hinzufügen AWT, Swing, JavaFX & SWT 2
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
T SWT Drag&Drop: Eclipse FileTransfer mit Icons AWT, Swing, JavaFX & SWT 14
M GEF und Eclipse Plugin schwierigkeiten AWT, Swing, JavaFX & SWT 2
B Debugging in Eclipse, Aufrufreihenfolge AWT, Swing, JavaFX & SWT 3
E Wo findet man: org.eclipse.core.runtime.ListenerList AWT, Swing, JavaFX & SWT 4
S [Eclipse RCP] Relativer Pfad AWT, Swing, JavaFX & SWT 8
Binary.Coder Netbeans GUI zu Eclipse (schon gegooglet und einiges ausprobiert). AWT, Swing, JavaFX & SWT 4
P SWT Eclipse Draw2D Drag and Drop (ruckelt) AWT, Swing, JavaFX & SWT 4
G Große dynamische ContextMenus erzeugen (Eclipse RCP) AWT, Swing, JavaFX & SWT 4
Crashbreaker SWT Frames wie bei Eclipse AWT, Swing, JavaFX & SWT 43
J Swing Pro WindowBuilder in Eclipse AWT, Swing, JavaFX & SWT 2
D Problem mit SmartGWT (2.4) und Eclipse (3.6) AWT, Swing, JavaFX & SWT 6
J SWT JFace Tree in Section unsichtbar (Eclipse Forms) AWT, Swing, JavaFX & SWT 5
M 3D-Grafik Java3D-Application als executable .jar exportieren (Eclipse) AWT, Swing, JavaFX & SWT 5
K SWT oder AWT als Download für Eclipse AWT, Swing, JavaFX & SWT 5
dzim SWT Layout mit Sections aus Eclipse Forms AWT, Swing, JavaFX & SWT 17
A SWT Eclipse JFace Binding TreeViewer AWT, Swing, JavaFX & SWT 4
A Suche: Eclipse-GUI-Layout AWT, Swing, JavaFX & SWT 5
E JavaHelp mit Eclipse AWT, Swing, JavaFX & SWT 2
B SWT Hello World-Anwendung mit GUI in Eclipse -Problem mit Import von SWT AWT, Swing, JavaFX & SWT 9
J eclipse/Visual Editor: Auf Felder/Methoden vom Hauptframe zugreifen AWT, Swing, JavaFX & SWT 4
M Swing Memory Spiel in Eclipse AWT, Swing, JavaFX & SWT 5
U Netbeans GUI nach Eclipse AWT, Swing, JavaFX & SWT 7
J Anwendung von Swing nach SWT bzw. Eclipse portieren AWT, Swing, JavaFX & SWT 3
G Look And Feel in Eclipse AWT, Swing, JavaFX & SWT 2
D Swing eine Art vorschlagsfenster wie in eclipse bei "." AWT, Swing, JavaFX & SWT 5
H Eclipse View / Window Layout AWT, Swing, JavaFX & SWT 3
S Dropdown-Menü wie auf der Eclipse-Toolbar AWT, Swing, JavaFX & SWT 7
T [Applet] startet in Eclipse aber nicht im Browser AWT, Swing, JavaFX & SWT 2
D Autovervollständigung wie bei Dreamweaver/Eclipse AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben