SWT: wie aktualisiere ich ein Canvas zur Laufzeit?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo allerseits,

habe gerade mit SWT Programmierung angefangen, und bin gerade dabei mit ner Zeichenfläche (Canvas) zu arbeiten.
Mein Problem klingt ziemlich banal, aber ich hab momentan irgendwie ein Brett vorm Kopf - wahrscheinlich, weil ich noch nicht ganz nachvollzogen habe, wie das painting in SWT gehandhabt wird.

Aus AWT/Swing war ich gewohnt, dass automatisch die paint(Graphics g) Methode aufgerufen wurde. Die konnte ich mit nem repaint() auch im Nachhinein (zur Laufzeit) erneut aufrufen (bei veränderten Parametern (in dem Fall dann z.B. Attribute) wurde dann z.B. was anderes gezeichnet)

Nur bei SWT wird das ganze ja über das PaintEvent gesteuert.
Bisher habe ich meinen Code daher nach folgendem Schema aufgebaut:
Code:
public class Graph extends Canvas implements PaintListener{

  public Graph(Composite parent, int style){
		super(parent, style);
		addPaintListener(this);
  }

  private void paint(PaintEvent e) {
       GC gc = e.gc;
       gc.drawString("Hello World", 50,50);
       gc.dispose();
  }	

  public void paintControl(PaintEvent e) {
	paint(e);
  }
   
}

Wenn ich aus ner anderen Klasse nun ein Graph Objekt erstelle, wird automatisch die paintControl() Methode aufgerufen, die dann wiederum das PaintEvent an die paint() weiterleitet.
Nur was mach ich jetzt, wenn ich zur Laufzeit noch was dazu zeichnen will? Denn in SWT gibts ja offensichtlich kein repaint().


Konkrete Frage:
Angenommen, meine GUI wird jetzt geladen und erstellt per "new Graph(parent, style)"-Aufruf eine Zeichenfläche mit dem oben genannten "Hello World"-String an Position 50,50. Nun habe ich in der GUI noch nen Button. Wenn auf den Button geklickt wird, soll nun zusätzlich zu dem String noch mal z.B. eine Linie eingezeichnet werden. Was muss ich dazu nun in die Methode meines Actionlisteners (der auf den Button-Klick reagiert) reinschreiben?

Ich steh grad voll auf dem Schlauch, weil ich nicht weiß, wie ich jetzt noch mal an ein PaintEvent komme, um daraus einen neuen GC zu bekommen, mit dem ich erneut was zeichnen kann...
 
P

Phil

Gast
Guten Morgen,

Ich hatte gestern diesen obigen Post geschrieben, und habe bisher nicht eine Antwort bekommen. Lag das bisher daran, dass einfach nur noch keiner eine Antwort wusste, oder weil ihr meine Frage nicht verstanden habt, oder etwa daran, dass meine Frage zu banal ist? Bitte gebt mir mal Feedback...

Danke euch
Phil (=Gast)
 

byte

Top Contributor
Die meisten benutzen hier wohl kein SWT, daher kam bisher auch keine Antwort. Ich kann Dir leider auch nicht beantworten, wie man das Canvas explizit neu zeichnet. Ich weiss nur, dass man generell nur über den PaintListener zeichnen sollte, weil sonst halt das Canvas nicht korrekt neu gezeichnet wird, wenn z.B. das Fenster verschoben wird.

PS: gc.dispose() ist unnötig, weil Du den GC nicht selbst erzeugst.


Edit: Mir ist grade etwas eingefallen. Du könntest bei Bedarf einfach einen neuen PaintListener dem Canvas adden, der dann entsprechend etwas anderes zeichnet. Dazu am besten den PaintListener einfach als anonyme Klasse implementieren, z.B. so:

Code:
...
Canvas graph = new Canvas(parent, style)
graph.setLocation(...);
graph.setSize(...);
graph.addPaintListener(new PaintListener() {
  public void paintControl(PaintEvent e) {
    GC gc = e.gc;
    gc.drawString("Hello World", 50, 50);
  }   
});

...

//irgendwo anders dann halt
graph.addPaintListener(new PaintListener() {
  public void paintControl(PaintEvent e) {
    GC gc = e.gc;
    gc.drawString("Hello other World", 100, 100);
  }   
});
 
P

Phil

Gast
Danke dir byto,

Mittlerweile habe ich rausgefunden, dass es in SWT doch einen ersatz für repaint() gibt: redraw() :lol:
(unglaublich, dass ich solange gebraucht habe, um das rauszufinden...)
Mit redraw() zwinge ich das Canvas zum neuzeichen - d.h. ich schicke ein neues PaintEvent. So brauch ich dann auch nicht mehr über anonyme PaintListener gehen - aber danke für den Tipp!!!

Mittlerweile funktioniert es so, dass ich ein ein Attribut in meiner Graph Klasse habe, das mit true/false besetzt wird.
In meiner GUI habe ich dann ne Checkbox. Wenn das Häkchen da gesetzt wird, reagiert mein SelectionListener der GUI darauf und setzt dann das Attribut in meiner Graph Klasse auf true. Danach geb ich ein redraw() durch. Dadurch wird meine paint-Methode in der Graph Klasse wieder angesprochen, in der ich dann das Attribut abfrage, und wenn es gesetzt ist, eine Linie hinzuzeichne.

BeispielCode innerhalb meines SelectionListeners:
Code:
(...)
// zum Verständnis die Deklaration der Variablen:
Graph gr = new Graph(parent, style);
Button bt_check= new Button(parent, SWT.CHECK);
bt_check.addSelectionListener(this);
(...)
public void widgetSelected(SelectionEvent e) {		
	if(e.getSource()==bt_check){
		if(bt_check.getSelection()){
			gr.setLine(true);
			gr.redraw();
 		}
		if(!bt_check.getSelection()){
			gr.setLine(false);
				gr.redraw();
		}
	}
}

Dazu der BeispielCode innerhalb meiner Graphklasse:
Code:
public class Graph extends Canvas implements PaintListener{

private boolean line = false;

  public Graph(Composite parent, int style){
      super(parent, style);
      addPaintListener(this);
  }

  private void paint(PaintEvent e) {
       GC gc = e.gc;
       gc.drawString("Hello World", 50,50);
       
       //hier pruefe ich nun, ob die Linie gezeichnet werden soll, oder nicht.
       if(line){
          gc.drawLine(0,0,100,100);
       }

       gc.dispose();
  }   

  public void setLine(boolean flag){
     this.line=flag;
  }
  
  public void paintControl(PaintEvent e) {
    paint(e);
  }
   
}

-------------------------------------

byto hat gesagt.:
PS: gc.dispose() ist unnötig, weil Du den GC nicht selbst erzeugst.
Ich hab halt mal gelesen, dass man gc.dispose() stets durchführen soll, da das SystemRessourcen belegt, die erst nach dispose() wieder freigegeben werden...
 

byte

Top Contributor
Ah gut zu wissen mit dem redraw(). Brauch ich vielleicht auch bald. :)

Wegen dem dispose(): Du musst nur die Komponenten disposen, die Du auch explizit erzeugt hast. Also wenn Du z.b. schreibst GC gc = new GC(), dann musst Du auch irgendwann gc.dispose() machen. Aber in Deinem Fall erzeugst Du das GC ja nicht sondern holst es Dir über e.gc, dann musst Du es auch nicht disposen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A SWT/RCP - wie aktualisiere ich ein GUI(FormPage)? AWT, Swing, JavaFX & SWT 2
T Wie aktualisiere ich die Contents einer JTabbedPane? AWT, Swing, JavaFX & SWT 3
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H JavaFX Gedrehter Text auf Canvas (Positionierung) AWT, Swing, JavaFX & SWT 6
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
W Canvas oder Polygone? AWT, Swing, JavaFX & SWT 3
Monokuma Canvas Form entfernen AWT, Swing, JavaFX & SWT 2
Monokuma KeyEvent in der Canvas Klasse AWT, Swing, JavaFX & SWT 0
M Internal Frames und Canvas-Element AWT, Swing, JavaFX & SWT 9
TheJavaKid Auf eine Zeichnung im Canvas reagieren AWT, Swing, JavaFX & SWT 13
M Halbkreiszeichnen(Canvas) - Diesen mit Mouseevents bestücken AWT, Swing, JavaFX & SWT 3
dereki2000 AWT Canvas zeichnet nicht AWT, Swing, JavaFX & SWT 7
D Canvas oder scene graph? AWT, Swing, JavaFX & SWT 16
J Canvas wird nicht angezeigt AWT, Swing, JavaFX & SWT 10
Y Objekte grafisch darstellen ohne GMF - Composite auf Canvas? AWT, Swing, JavaFX & SWT 2
Prafy AWT Klickbare Bereiche auf Canvas AWT, Swing, JavaFX & SWT 2
J JavaFX JavaFX Canvas einfaches Zeichenprogramm AWT, Swing, JavaFX & SWT 7
P MalProgramm mit JScrollPane und Canvas AWT, Swing, JavaFX & SWT 2
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
L JavaFX Canvas max size? AWT, Swing, JavaFX & SWT 1
J JavaFX Rendering von Canvas sehr langsam AWT, Swing, JavaFX & SWT 2
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
Regedit JavaFX Java Canvas hört ständig auf zu aktualisieren/malen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
B JavaFX KeyEvent und Canvas draw Problem AWT, Swing, JavaFX & SWT 9
K Fragen zu JavaFx Canvas AWT, Swing, JavaFX & SWT 0
C Java FX Canvas missing getGraphicContext2D AWT, Swing, JavaFX & SWT 5
windl Overlay mit Transparentem JWindow und Canvas AWT, Swing, JavaFX & SWT 2
S JavaFX Canvas - nur eine Figur auf der Zeichenfläche färben? AWT, Swing, JavaFX & SWT 1
R JComponent auf Canvas AWT, Swing, JavaFX & SWT 8
S Canvas durch transparentes JPanel sichtbar machen AWT, Swing, JavaFX & SWT 2
A JavaFX Menubar wird von Canvas überzeichnet AWT, Swing, JavaFX & SWT 8
antonbracke Multiplayer Shooter- Wie geht das mit Canvas & Graphics AWT, Swing, JavaFX & SWT 6
Luk10 KeyBindings mit Canvas? AWT, Swing, JavaFX & SWT 3
B LookAndFeel GWT: Canvas in TabSet nicht sichtbar AWT, Swing, JavaFX & SWT 2
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
T Canvas clipping AWT, Swing, JavaFX & SWT 4
S 2 Canvas übereinander AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Canvas Problem(Größe) AWT, Swing, JavaFX & SWT 6
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
F Canvas Objekt außerhalb des Frames zeichnen AWT, Swing, JavaFX & SWT 3
M Wofür Canvas? AWT, Swing, JavaFX & SWT 5
frankred Swing Canvas nach "Window-resize" neu Zeichnen lassen wegen Anzeigefehler AWT, Swing, JavaFX & SWT 4
S Canvas in ScrollPane wird beim scrollen immer neu gezeichnet AWT, Swing, JavaFX & SWT 3
F Nur ein Objekt auf Canvas neu zeichnen AWT, Swing, JavaFX & SWT 4
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
lumo SWT Canvas transparent AWT, Swing, JavaFX & SWT 4
2 AWT Zeichnen in Canvas AWT, Swing, JavaFX & SWT 5
B 2D-Grafik Malen/übermalen mit Canvas AWT, Swing, JavaFX & SWT 5
L Dynamisch Objekte in Canvas zeichnen AWT, Swing, JavaFX & SWT 5
G Auf Canvas zeichnen nur über boolean-Abfragen? AWT, Swing, JavaFX & SWT 5
S Canvas-Inhalt in Laufzeit ändern AWT, Swing, JavaFX & SWT 6
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
S Bild wird auf Canvas in Applet nicht gezeichnet AWT, Swing, JavaFX & SWT 4
G SWT Linie unter transparentes Canvas zeichnen AWT, Swing, JavaFX & SWT 4
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
S SWT Canvas: Flackernde Bilder AWT, Swing, JavaFX & SWT 3
T AWT canvas AWT, Swing, JavaFX & SWT 3
P Canvas: String wird nicht gezeichnet AWT, Swing, JavaFX & SWT 5
T SWT Canvas Koordinaten per MouseMove auslesen AWT, Swing, JavaFX & SWT 1
H Zeichnen auf smartgwt Canvas AWT, Swing, JavaFX & SWT 4
G Drag and Drop JTree to Canvas AWT, Swing, JavaFX & SWT 7
K Swing Sinuskurve zeichnen auf Canvas AWT, Swing, JavaFX & SWT 2
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
J Canvas / paint() AWT, Swing, JavaFX & SWT 2
D Canvas soll angezeigtes jpg-Bild aktualisieren AWT, Swing, JavaFX & SWT 4
N zeichnen auf awt canvas AWT, Swing, JavaFX & SWT 9
G Ein Wort in einem String färben in einer Canvas AWT, Swing, JavaFX & SWT 10
J Canvas Inhalt als Bild speichern! AWT, Swing, JavaFX & SWT 16
T zeichnen mit canvas AWT, Swing, JavaFX & SWT 3
S repaint im Canvas AWT, Swing, JavaFX & SWT 3
D Canvas und Buttons AWT, Swing, JavaFX & SWT 20
P Zeichnen in Canvas und Neuzeichnen AWT, Swing, JavaFX & SWT 3
G Canvas + Swing-Objekte AWT, Swing, JavaFX & SWT 5
C canvas.draw zeichne ohne ausfüllen AWT, Swing, JavaFX & SWT 9
P Canvas in JFrame mit GridLayout AWT, Swing, JavaFX & SWT 4
B Graphics und Canvas - Problem AWT, Swing, JavaFX & SWT 2
T Canvas gegen Container austauschen --> GUI fehlt AWT, Swing, JavaFX & SWT 4
P Canvas Inhalt löschen AWT, Swing, JavaFX & SWT 4
D Canvas über JMenuBar AWT, Swing, JavaFX & SWT 7
F ToolTip auf Canvas AWT, Swing, JavaFX & SWT 2
L Probleme mit mehreren Canvas: Überlagerungseffekte? AWT, Swing, JavaFX & SWT 5
N Zu hoher Speicherverbrauch beim Zeichnen (Canvas) AWT, Swing, JavaFX & SWT 5
G Canvas im JPanel - "Freie" Fläche Problem AWT, Swing, JavaFX & SWT 10
T Textfeldwert in canvas AWT, Swing, JavaFX & SWT 4
D cannot access Canvas AWT, Swing, JavaFX & SWT 13
G Canvas in SWT aktualisieren AWT, Swing, JavaFX & SWT 21
S AUF Canvas Zeichnen Fehler! AWT, Swing, JavaFX & SWT 10
G Canvas löschen AWT, Swing, JavaFX & SWT 15
H Sowas wie ein Canvas AWT, Swing, JavaFX & SWT 3
D Inhalt einer Canvas löschen (SWT.NO_BACKGROUND gesetzt) AWT, Swing, JavaFX & SWT 3
G GridBagLayout mit Canvas-Positionsproblem AWT, Swing, JavaFX & SWT 5
J Canvas und JTextField AWT, Swing, JavaFX & SWT 2
T erkennen ob innerhalb oder außerhalb von canvas gezeichnet AWT, Swing, JavaFX & SWT 2
S Problemen mit Canvas-Objekten im GridLayout AWT, Swing, JavaFX & SWT 8
P Tranparentes Canvas AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen


Oben