[SWT] Problem mit Sichtbarkeit

Ischterai

Mitglied
Hi,

ich will in Jave ein Programm zum darstellen einiger Daten als diagramm schreiben, habe aber das Problem, das die zum Graphen gehörige Legende erst bei einem maximieren bzw. einer Änderung der Größe der Shell angezeigt wird.

hier wird die legende erzeugt, bei welcher man die farbe der einzelnen Graphen verändern kann. Aus einer Datenmenge entstehen immer 2 Graphen
Code:
public void addLegend( final int position){

		//Layout und Data
		GridData legenddata = new GridData(GridData.FILL_HORIZONTAL);
		legenddata.horizontalAlignment = SWT.FILL;
		legenddata.horizontalSpan = 1;
		
		GridLayout grouplayout = new GridLayout();
		grouplayout.numColumns = 4;
		
		Group group = new Group(legendparent, SWT.NONE);
		group.setLayoutData(legenddata);
		group.setLayout(grouplayout);
		
		Label cost = new Label(group, SWT.NONE);
		cost.setText("Kosten");
		
		GridLayout gridlayout = new GridLayout();
		
		GridData griddata = new GridData(GridData.FILL_HORIZONTAL);
		
		Canvas costColorlocal = new Canvas(group, SWT.FILL);
		costColorlocal.setBackground(display.getSystemColor(this.getcolorcount()));//liefert wert zwischen 3 und 15
		costColorlocal.setLayout(gridlayout);
		costColorlocal.setLayoutData(griddata);
		this.costColor.add(costColorlocal);// list mit Canvas
		
		Button costButton = new Button(group, SWT.NONE);
		costButton.setText("...");
		costButton.addSelectionListener(new SelectionAdapter() {
		      public void widgetSelected(SelectionEvent e) {
		    	  ColorDialog cd = new ColorDialog(parentShell);
		          cd.setText("ColorDialog ");
		          cd.setRGB(new RGB(255, 255, 255));
		          costColor.get(position).setBackground(new Color(display, cd.open()));	
		          updateGUI();
		      }
		    });
		
		GridData labelgriddata = new GridData();
		labelgriddata.verticalSpan = 2;
		
		Label thema = new Label(group, SWT.NONE);
		String s= daten.get(position).getName();
		for(int i=20; i<s.length(); i+=20){
			StringBuilder sb = new StringBuilder();
			sb.append(s.substring(0, i));
			sb.append("\n");
			sb.append(s.substring(i));
			s=sb.toString();
		}
		thema.setText(s);
		thema.setLayoutData(labelgriddata);
		
		Label benefit = new Label(group, SWT.NONE);
		benefit.setText("Nutzen");
		
		Canvas benefitColorlocal = new Canvas(group, SWT.CENTER);
		benefitColorlocal.setBackground(display.getSystemColor(this.getcolorcount()));
		benefitColorlocal.setLayout(gridlayout);
		benefitColorlocal.setLayoutData(griddata);
		this.benefitColor.add(benefitColorlocal);
		
		Button benefitButton = new Button(group, SWT.NONE);
		benefitButton.setText("...");
		benefitButton.addSelectionListener(new SelectionAdapter() {
		      public void widgetSelected(SelectionEvent e) {
		    	  ColorDialog cd = new ColorDialog(parentShell);
		          cd.setText("ColorDialog Demo");
		          cd.setRGB(new RGB(255, 255, 255));
		          benefitColor.get(position).setBackground(new Color(display, cd.open()));	
		          updateGUI();
		      }
		    });
		
		this.legendgroup.add(group); // liste zum abspeichern der Group
	}

aufgerufen wird das ganze hier:
Code:
public void updateGUI(){
		//Legende erzeugen
		if(this.daten.size()>this.legendgroup.size()){
			for(int i=this.legendgroup.size(); i<workshops.size(); i++){
				this.addLegend( i);
			}
		}
		
		canvas.redraw(); // Graphen neu zeichnen
	}

diese Funktione wird gerade noch bei jeder aktion die mit der Gui zu tun hat aufgerufen, also sehr oft, trotzdem wird der Legendeneintrag erst nach einem ändern der Größe angezeigt. das er da ist ist sicher, da ich aus den Canvas-Objekten über die hintergrundfarbe die Farbe der Graphen setzte, sonst würde es einen Nullpointer geben.

Hat einer ne ahnung was z.B. bei der shell.setMaximized(true); aufgerufen, was ich vergessen habe?

Grüße Ischterai
 
versuch mal nach dem redraw(); ein update(); einzufügen... resp. am ende deiner initialisierung.
redraw(); markiert den Bereich nur als etwas das irgendwann neu gezeichnet werden muss. update() sollte so ein neuzeichnen auslösen und erst zurückkehren wenn neu gezeichnet wurde...
Ist ne Weile her, aber wenn ich mich recht entsinne... ;)

EDIT: also canvas.update(); oder dann update auf die parent component/control der canvas
 
Zuletzt bearbeitet:
Morgen,

habe jetzt alles was auf der Gui sinnvoll gewesen wäre redraw() und dann update() gemacht, hat aber nichts gebracht. Seltsam ist auch wenn ich beim starten schon 2 Graphen-Daten angebe erstellt er beim start mit dem updateGui() die beiden richtig, aber wenn ich die 2. erst wärend der laufzeit einfüge braucht er ein maximieren um die Gruppe sichtbar zu machen.

Mit dem Canvas hat das auch nichts zu tun, hab ver gessen anzugeben, das parentlegend eine Gruppe neben dem Canvas auf dem ausschließlich der Graph ist. Dieser ist komischerweise immer richtig geupdated.
 
Hallo,

dies scheint wohl daran zu liegen, dass kein neues Layout(en) des parent Composites stattfindet. Habe Kurzem auch mit einem ähnlichen Problem gekämpft. Es hat sich schnell herausgestellt, dass das Aufrufen der layout() Methode des parents den gewünschten Effekt hatte.

Viele Grüße,
Batnix
 
Hallo Ischterai,

auf den ersten Blick würde ich vermuten, dass das Composite namens legendparent.getParent() ein GridLayout hat und die darauf befindlichen Kindelemente (zumindest canvas nehme ich an) durch ein GridData mit FILL-Eigenschaft das Ganze ausfüllt und wie schon von Batnix angesprochen eines legendparent.getParent().layout() am Ende von updateGUI() bedarf.

Sollte das nicht funktionieren (bzw. eigentlich auch unabhängig davon...) kannst du am Anfang von updateGUI() ein legendparent.getParent().setRedraw(false) und am Ende der Methode wieder ein legendparent.getParent().setRedraw(true) (oder auf einem noch höher in deiner GUI aufgehängten Composite) einsetzen, um einerseits deine Performance zu verbessern und andererseits durch setRedraw(true) ein Aktualisieren der angesprochenen Oberfläche anzustoßen.

legendparent.getParent() wäre vorzugsweise natürlich durch die eigentliche Komponente zu ersetzen, aber deren Name taucht ja in deinem geposteten Code nicht auf.

Ganz nebenbei: wenn canvas nicht das Elternelement von legendparent ist, forderst du dann ein Aktualiseren des übergeordneten Elements?


Grüße
Carron
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück