Compos Aktuallisierung

Status
Nicht offen für weitere Antworten.

HaukeG

Mitglied
Hallo zusammen,

ich habe schon den ganzen Tag bei Google nach meinen Problemen gesucht, aber ich weiß nicht so recht wie ich es in Worte fassen soll, dass Google mir helfen kann. Daher muss ich jetzt doch mal ins Forum schreiben:

Ich habe ein Composite

Code:
	Composite composite = new Composite(tabFolder, SWT.NONE);
	composite.setLayout(new FillLayout(SWT.HORIZONTAL));

dort setze ich ein Tree auf die linke Seite :

Code:
	final Tree tree = new Tree(composite, SWT.LEFT);

und auf der rechten Seite möchte ich die Eigenschaften die hinter dem jeweiligen TreeItem stehen, anzeigen.

Also Vergleichbar mit Verzeichnissen auf der linken Seite und rechts sollen die Dateien des ausgewählten Verzeichnis erscheinen (ist nur ein Beispiel, ich will das nicht mit Dateien usw machen) :)


Dann habe ich
Code:
	final Composite right = new Composite(composite, SWT.NONE);
	GridLayout rightLayout = new GridLayout(2, true);
	rightLayout.horizontalSpacing = 40;

	Color red = Display.getDefault().getSystemColor(SWT.COLOR_RED);
	right.setBackground(red);
	right.setLayout(rightLayout);
	
	GridData gd = new GridData();
	gd.widthHint = 100;
	
	Label x = new Label(right, SWT.NONE);
	x.setText("Name");
	
	Text t1 = new Text(right, SWT.RIGHT);
	t1.setText("123");
	t1.setLayoutData(gd);

	tree.addListener (SWT.MouseDown, new Listener () {
		public void handleEvent (Event event) {
			Point point = new Point (event.x, event.y);
			TreeItem item = tree.getItem (point);
			if (item != null) {
				loadPropertyPage(item, right);
			}
		}
	});

also das auf der rechten Seite defaultmäßig ein Label NAME steht und ein Textfeld mit dem Wert 123.

Wenn nun auf ein Item geklickt wird, wird die Funktion loadPropertyPage aufgerufen (funktioniert auch).
Nun möchte ich aber in dieser Methode komplett neue Labels und Textfelder auf der rechten Seite erzeugen.

Ich hatte das so gedacht:

Code:
 private void loadPropertyPage(TreeItem item, Composite right) {
		
	  GridLayout rightLayout = new GridLayout(2, true);
		
		rightLayout.horizontalSpacing = 40;
		Color blue = Display.getDefault().getSystemColor(SWT.COLOR_BLUE); 

		right.setLayout(rightLayout);
		right.setBackground(blue);
		
		GridData gd = new GridData();
		gd.widthHint = 100;
		
		Label x = new Label(right, SWT.NONE);
		x.setText("ID");	
  }

Das mit der Hintergrundfarbe funktioniert (ist aber eigentlich nur ein Test gewesen), aber ich sehe kein ID Label, sondern nur das vorherige NAME und Textfeld mit 123.


Woran mag das liegen? Mache ich da einen Denkfehler?
Wäre über jeden Tipp dankbar.

Viele Grüße,
Hauke
 
G

Gast2

Gast
habs jetzt zwar nicht ganz so verstanden bzw. vorstellen können was du genau gemeint hast...
Aber das vorherige label löst sich ja nicht einfach in Ludt aus...
Entweder du änderst von dem den text oder du musst es removen bevor dass andere darüber machst...
 

HaukeG

Mitglied
Hi,

gibt es eine Möglichkeit ein Composite komplett zu leeren? Denn es wäre ja sehr umständlich wenn ich bei jedem Klick erst jedes einzelne Label wieder löschen müsste.

Vielleicht zur besseren Verständigung.

Im TreeView (COmposite left) habe ich

A
|---B
| ---C
| ---D
|-- E

im Compsoite right möchte ich nun die Werte, die hinter dem jeweiligen Element stehen, anzeigen lassen.

Also ganz einfach, jedes Element hat einen Namen A-E
und je nach dem welches Element ich anklicke soll im Composite right im Textfeld A - E stehen. Wenn das funktioniert kann ich mir den rest selbst zusammen basteln.

Viele Grüße,
Hauke
 
G

Gast2

Gast
und warum schreibst du den text nicht in das vorhandene label????
und in deinem obrigen code fügst du dem "neuen" label keine layout daten hinzu...
 

HaukeG

Mitglied
Hi nochmal und danke schonmal für Deine Bemühungen!

Ich habe erstmal
x.setLayoutData(gd);
hinzugefügt. Das hatte ich auch schon vorher gehabt, aber wieder auskommentiert. Geht aber immer noch nicht.

Das Thema warum ich das nicht einfach überschreibe liegt evt daran das ich das System noch nicht ganz durchschaut habe. Aber wenn ich das richtig verstehe müsste ich meiner Methode anstatt des rechten composite dann ja das Label übergeben und die Methode würde dann
label.setText("xyz");
machen.

Das würde auch funktionieren (denke ich) aber das Problem ist, dass auf der rechten Seite je nach ausgewählt Item unterschiedlich viele Labels und Textfelder erscheinen müssen. Denn einige Items haben mehrere Konfigurationsparameter die auf der rechten Seite erscheinen sollen, andere weniger.

Daher hätte ich jetzt einfach nur das Composite übergeben und die Methode sollte dann die Labels + Textfeld anlegen.


NOchmals vielen Dank für die schnelle Reaktion.

VIele Grüße,
Hauke
 
G

Gast2

Gast
1. vielleicht könntest du ein kleine besipiel programm machen wo ich den effekt sehen kann was du überhaupt vor hast...
2. musst du ja irgendwo informationen gespeichert haben wieviele textfelder oder labels kommen sollen...ich seh irgendwie keine abhänigkeit von dem item zu deinem code
 

HaukeG

Mitglied
Hi.

ich werde ein Beispiel aufbereiten, aber das dauern ein wenig, da ich das alles zusammenschneiden muss.

Die zusammengehörigkeit ist etwas umständlicher.

Ich habe zwei Tabellen in der DB

handler
*******
id
name


properties
*********
id
handlerId
name
value

(Das ist auch nur vereinfacht, da handler eigentlich auch unterhandler (also wie der Tree auch) haben kann).

Der Tree entspricht der handler-Tabelle.
ich schreibe die handlerID mit in das TreeItem Objekt per setData("id", 123);

So kann ich dann später auswerten, welcher Handler angeklickt worden ist. Dann würde ich einfach alle properties aus der Tabelle zu der Handler ID laden und die sollen rechts angezeigt werden mit Name + Textfeld (ist der value).



Diesen Datenbankconnect habe ich aber zZ noch nicht. Daher habe ich das jetzt erstmal nur so machen wollen, dass sich überhaupt irgendwas auf der _rechten_ Seite verändert, wenn ich wo rauf klicke.

Ich mach mich mal eben an das Beispiel.

Danke und viele Grüße,
Hauke
 

HaukeG

Mitglied
So, habe das Beispiel fertig und ich glaube ich habe das Problem gefunden, welches durch Eclipse automatisch erzeugt worden ist. Aber evt kannst du mir da auch helfen und ein Tipp geben.

zZ wird das Fenster einfach geteilt links TreeView, rechts zum Anfang einfach ein Label ohne Textfeld.

Wenn irgendwo drauf geklickt wird, soll rechts ein Label ID + Textfeld mit der ID des TreeItems erscheinen.

Das Problem liegt doch bestimmt an dem Listener. Dort übergebe ich doch das Composite right an loadProperty. Aber Eclipse hat right final gemacht. Ich gehe davon aus, das hier das Problem liegt.

Trotzdem mein Beispiel und evt kann mir da jemand sagen wie ich das Geschickt lösen kann.

Code:
import org.eclipse.swt.SWT;

import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class TreeViewExample {
  
  public static void main(String[] args) {
	    new TreeViewExample().run();
  }  

  public void run() {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    createContents(shell);

    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }
    display.dispose();
  }

  private void createContents(Shell shell) {
	  Composite composite = new Composite(shell, SWT.NONE);
	  composite.setLayout(new FillLayout(SWT.HORIZONTAL));
			
	  Color red = Display.getDefault().getSystemColor(SWT.COLOR_RED);
		
	  final Tree tree = new Tree(composite, SWT.LEFT);
	  TreeItem t1 = new TreeItem(tree, SWT.NONE);
	  t1.setText("Element 1");
	  t1.setData("id", "1");
	  
	  TreeItem t2 = new TreeItem(t1, SWT.NONE);
	  t2.setText("Element 2");
	  t2.setData("id", "2");

	  TreeItem t3 = new TreeItem(tree, SWT.NONE);
	  t3.setText("Element 3");
	  t3.setData("id", "3");

	  
	  final Composite right = new Composite(composite, SWT.NONE);
	  GridLayout rightLayout = new GridLayout(2, true);
		
	  right.setLayout(rightLayout);
	  right.setBackground(red);
		
	  GridData gd = new GridData();
	  gd.widthHint = 100;
		
	  Label defaultLabel = new Label(right, SWT.NONE);
	  defaultLabel.setText("Noch nirgends gedrueckt"); 

		tree.addListener (SWT.MouseDown, new Listener () {
			public void handleEvent (Event event) {
				Point point = new Point (event.x, event.y);
				TreeItem item = tree.getItem (point);
				if (item != null) {
					loadPropertyPage(item, right);
				}
			}
		});		    
  }

  private void loadPropertyPage(TreeItem item, Composite right) {
	  GridLayout rightLayout = new GridLayout(2, true);
		
	  Color blue = Display.getDefault().getSystemColor(SWT.COLOR_BLUE); 

	  right.setLayout(rightLayout);
	  right.setBackground(blue);
		
	  GridData gd = new GridData();
	  gd.widthHint = 100;
		
	  Label idLabel = new Label(right, SWT.NONE);
	  idLabel.setText("ID");
	  idLabel.setLayoutData(gd);
		
	  Text idTextFeld = new Text(right, SWT.RIGHT);
	  idTextFeld.setText((String) item.getData("id"));
	  System.out.println((String) item.getData("id"));
	  idTextFeld.setLayoutData(gd);	
  }
}

Vielen Dank und viele Grüße,
Hauke
 
G

Gast2

Gast
ich schaus mir mal an aber an dem final liegt es nicht... du musst das right final machen oder als member variable deklarieren, da du es in einer inneren klasse verwendest...

EDIT:
hab deine methode mal bischen erweitert mit kommentare
Code:
  private void loadPropertyPage(TreeItem item, Composite right) {  
	 
	  // 1 Möglichkeit um die rechte Seite wieder aufzuräumen sonst hast du nachher 10000 textfelder kanns ja mal selber versuchen ;)
	  // vielleicht fällt dir selber noch eine bessere ein ist mir als 1. aingefallen....
	 
	 for (Control c :right.getChildren())
	 {
		 c.dispose();
	 }
	 
	  
     Color blue = Display.getDefault().getSystemColor(SWT.COLOR_BLUE);

     right.setBackground(blue);

     Label idLabel = new Label(right, SWT.NONE);
     idLabel.setText("ID");
     idLabel.setLayoutData(new GridData());
      
     Text idTextFeld = new Text(right, SWT.NONE);
     idTextFeld.setText((String) item.getData("id"));
     idTextFeld.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));  
     // damit der layoutmmanager das layout mit den neuen componenten neu berechnen kann
     right.layout(true);
  }
 

HaukeG

Mitglied
Hi,

super vielen vielen Dank !

getChildren kannte ich nicht und die layout(boolean) Methode war mir auch nicht bekannt.

Danke für Deine Hilfe.

Viele Grüße,
Hauke
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben