Archiv verlassen und diese Seite im Standarddesign anzeigen : [SWT]: Widget durch anderes ersetzten, möglich?
Ich suche jetzt schon einige Zeit eine möglichkeit, wie man z.B. ein Canvas in einem GridLayout durch einen Button ersetzten kann.
Mfg
Hab ein bisschen herumprobiert, anscheinend kann man bei SWT nicht einmal die Layouteigenschaften dynamische verändern!
Das funktioniert z.B. nicht:
(Das gridspan war vorher auf 2)
dogName.addMouseListener(new MouseListener()
{
public void mouseUp(MouseEvent e)
{}
public void mouseDown(MouseEvent e)
{
System.out.println("Hallo");
GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gridData.horizontalSpan = 1;
dogName.setLayoutData(gridData);
dogName.setText("Ar***!");
dogName.redraw();
}
public void mouseDoubleClick(MouseEvent e)
{}
}
Hat irgendwer eine Idee wie man das trotzdem realisieren könnte, ohne das gesamte Fenster bei jeder Änderung neu aufzubauen...
Mfg
Man muss shell.layout(true) ausführen, damit sich das layout anpasst...
peschmae
31-05-2003, 15:59
Original geschrieben von ceisserer
Ich suche jetzt schon einige Zeit eine möglichkeit, wie man z.B. ein Canvas in einem GridLayout durch einen Button ersetzten kann.
wie geht dass den? Ich brauch das nämlich auch gerade :D
MfG Peschmä
Ich weiß nicht ob man das so machen darf, funktionieren tut schon, aber irgendwie kommts mir halt schmutzig vor...
Composite d = new Composite(shell, SWT.NONE);
Widget l = new Label(d, SWT.NONE);
---Layout-zeugs hab ich weggelassen...
l.dispose();
l = new Button(d, SWT.PUSH);
c.layout();
Ich glaube das funktioniert, einen Button durch einen anderen zu ersetzten funktioniert so.
Es gibt glaube ich auch ein paar Snippits von IBM
Mfg
peschmae
31-05-2003, 21:11
naja, eigentlich möchte ich zwei Widgets austauschen _ohne_ sie neu zu erstellen (zwei Tabellen, eine oben, die andere unten oder eben umgekehrt)
der Aufwand all das zeugs auszulesen und wiederherzustellen wäre a bisserl gross
mal schauen, ob ich das hinkrieg :)
MfG Peschmä
Nun, so was ähnliches habe ich auch gerade vor, und ja auch bei mir wäre es zuviel Aufwand alle Werte wieder zu setzten ;-)
Also wenn du rauskriegst ies geht, lass es mich bitte wissen!
peschmae
01-06-2003, 12:59
war recht einfach :D :D
mit FormLayout kannst du einfach die LayoutDatas neu setzen und dann
layout() aufrufen. Fertig.
Zu beachten ist allerdings, dass FormLayout nicht automatisch Vernünftige Daten für einige sachen Annimmt.
Du musst also z.B. bei zwei Buttons, die nebeneinander sind und sich höhenmässig über das ganze Fenster erstrecken auch für FormData.top bzw .bottom etwas sinvolles setzen (hier new FormAttachment(0, 0) respektive new FormAttachment(100, 0))
das war ne tolle falle :o
Bei mir gings dann doch nicht ganz so einfach, da ich die beiden Tabellen in einem SashForm hatte. Nun müsste ich also für linkeTabelle - FormData.right das Sash setzen. Das ist aber gemeinerweise private :mad:
Also musste ich mir halt selbst ein SashForm programmieren ;)
Das grösste Problem, war, dass man das Verschieben mit dem Sash auch gleich selber implementieren darf :p
aber jetzt läuft alles perfekt :)
MfG Peschmä
Ja aber dein Lösungsvorschlag bietet keine Möglichkeit, ein bestehdes Widget durch ein anderes zu ersetzetn?
peschmae
03-06-2003, 17:30
richtig,
aber du kannst (ungetestet) durchaus noch widgets per dispose() entfernen oder hinzufügen. Du musst einfach nachher noch die layoutData()'s anpassen und layout() aufrufen...
sollte gehen
MfG Peschmä
Schade, das hilft mir nicht weiter,
Trotzdem danke!
peschmae
04-06-2003, 15:09
was suchst du denn genau?
MfG Peschmä
Grüssi!
Nun, sagen wir ich habe ein Fenster mit einem Composite in einem GridLayout.
Ich möchte nun oft dieses Composite durch ein anderes ersetzten, und dann wieder durch das alte.
Jedes mal neu erzeugen hätte wenig Sinn, da so viel Werte zu setzten sind, das das alles sehr aufwändig sein würde.
Ich habe allerdings auf der Eclipse-Mailingliste nachgesehen, soweit ich erfahren habe funktioniert das nicht ;-((
peschmae
05-06-2003, 12:22
und wenn du das Layout des Composite auf FormLayout setzt, dann das eine oder andere Composite _darin_ erzeugst und jeweils über LayoutData und layout() das die benötigten Widgets anzeigst
------------Shell (GridLayout) ---------------------------------------
|-------------------------Composite (FormLayout) -----------------|
| |----------------------------------| |---------------------------------|
| | Widget1 oder Composite | | Widget2 oder Composite |
| |----------------------------------| |----------------------------------|
dann kannst du doch einfach Widget1 - LayoutData für Links auf "new FormData(0,0) und rechts new FormData(100, 0) setzen um Widget 1 anzuzeigen, selbiges für Widget 2
das sollte es doch auch ermöglichen, zur Laufzeit Widget1/2 neu hinzuzufügen oder zu erstellen, oder?
MfG Peschmä
Danke, an sowas hab ich noch gar nicht gedacht ;-)
Mfg
anda_skoa
05-06-2003, 14:31
gehts eventuell, wenn man beide widgets in einem Layout erzeugt und dann jeweils eins auf visible und das andere auf invisible setzt?
Ciao,
_
peschmae
05-06-2003, 19:20
naja,
wenn du setVisible(false) aufrufst, dann behält das Widget aber seine Grösse. Zumindest war das bei meinem GridLayout mit der Toolbar so. Also muss man diese auch noch null setzen.
Mit FormData hat man aber auch noch zusätzlich die Flexibilität irgendwo mittendrin ein Widget einzufügen/zu entfernen oder auszutauschen (auch wenn man dabei recht viele FormDatas anpassen muss)
MfG Peschmä
oracle2025
18-06-2003, 14:07
Hm, schon mal das Stacklayout probiert, vielleicht macht dass das was du willst.
peschmae
18-06-2003, 19:31
er oder ich?
Wieso nicht, allerdings hat er schon n GridLayout, das bedeutet er braucht eine Container - Composite
aber alle Lösungen haben offenbar das Problem, recht viele Composites oder sonstigen Aufwand zu brauchen :p
MfG Peschmä
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.