Canvas in SWT aktualisieren

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Salü Miteinander,

Ich habe folgendes Problem ich zeichne ein Diagramm welches alle ca. 200ms neu gezeichnet werden soll.

Zur Zeit wird es folgendermassen gezeichnet:

Code:
LineChart.paintChart(requestPerMin, saveRequestTimes, countUrls);   // Hier wird die Methode von einer anderes Klasse aus aufgerufen

Code:
        public void initialize(Composite parent) {   // Wird bereits beim Starten der Applikation aufgerufen
                canvas = new Canvas(parent, SWT.FLAT);
                canvas.setBounds(0, 265, 730, 350);
        }


public void paintChart(final long requestPerMin,
                        final List saveRequestTimes, int countUrls) {    // Wird alle ca. 200ms aufgerufen um die neusten Werte anzuzeigen


                canvas.redraw();
                canvas.addPaintListener(new PaintListener() {
                        public void paintControl(PaintEvent e) {
                                gcEvent = e.gc;
                                gcEvent.drawRectangle(20, 15, 700, chartHeight);                                        
                                setContents();

                        }
                });
        }

public void setContents() {
        oneMiliSecInPix = 300 / (float) (maxTime - minTime); // hier wird eine Mili sekunde in Pixel gerechnet
                pointEndLine = 27;
                pointStartLine = 0;

                for (int i = 1; i < saveRequestTime.size(); i++) { // Hier wird mit den Werten in der Array List saveRequestTime jeweils die ganze Linie in dem Diagramm gezeichnet
               
            pointStartLine = pointEndLine - 7;
            gcEvent.drawLine(pointStartLine, (int) (((float) (maxTime - (Long) saveRequestTime.get(i - 1)) * oneMiliSecInPix) + 15),
                pointEndLine, (int) (((float) (maxTime - (Long) saveRequestTime.get(i)) * oneMiliSecInPix) + 15));   // Hier werden die Zeiten aus dem Array umgerechnet und ausgegeben
                        pointEndLine += 7;
                }
        }

Nun das Problem ist das teilweise mehrere Linien auf dem Diagramm gezeichnet sind, welche dann schnell wieder verschwinden.
Nun weiss ich nicht ob das Problem darin liegt das ich jeweils bei jedem Aufruf einen neuen PaintListener erstelle?


kann mir jemand helfen??
Falls nicht alles klar ist, fragt doch einfach...

thx
 

Wildcard

Top Contributor
Nun weiss ich nicht ob das Problem darin liegt das ich jeweils bei jedem Aufruf einen neuen PaintListener erstelle?
Da stellt sich mir unweigerlich die Frage warum du das machst?
Die alten Listener verschwinden ja nicht einfach.
Irgendwann ist dein Programm nur noch am zeichnen.
 
G

Guest

Gast
weil es mir nicht möglich war die Grafik sonst zu zeichnen und zu aktualisieren.

Wie könnte ich das umgehen das dieser PaintListener nicht immer neu erstellt wird?
 
G

Gast

Gast
Wie kann ich es ändern das der PaintListener nur einmal erstellt wird??
 

byte

Top Contributor
Mach doch einfach folgendes: In Deiner Methode paintChart() zeichnest Du Deinen Kram zunächst in ein Image. Dann brauchst Du dem Canvas nur einmalig einen PaintListener zuweisen, der mit drawImage() dieses Bild auf Canvas zeichnet.
 
G

Guest

Gast
danke für den Tipp,
habe versucht es so zu erstellen, nun habe ich in der Methode initialize zusätzlich ein Image erstellt:

Code:
public void initialize(Composite parent) {
		canvas = new Canvas(parent, SWT.FLAT);
		canvas.setBounds(0, 265, 730, 350);
		Device display = Display.getDefault();
		image = new Image(display,730,350); 
                gcEvent = new GC(image); 
		canvas.redraw();
		canvas.addPaintListener(new PaintListener() {
			public void paintControl(PaintEvent e) {
			e.gc.drawImage(image, 0, 0);
			}
		});
	}

die Grafik wird nun zunächst in das Image (gcEvent.[...]) gezeichnet und danach mittels .drawImage() zugewiesen

Nun wird jedoch die Grafik nicht richtig gezeichnet, kannst du mir echt sagen an was das liegen könnte?
 

byte

Top Contributor
Anonymous hat gesagt.:
Nun wird jedoch die Grafik nicht richtig gezeichnet, kannst du mir echt sagen an was das liegen könnte?

Formuliere mal präziser, was genau nicht funktioniert. Du musst natürlich im Code auch entsprechende redraw() bzw. update() Aufrufe einbauen, immer dann, wenn das Canvas neu gezeichnet werden soll.
 
G

Gast

Gast
oohh, das habe ich natürlich vergessen, jetzt funktioniert es lediglich müsste ich irgendwie noch das image, jedesmal wenn die Canvas neu gezeichnet wird (redraw()) zurücksetzen, weisst du wie das möglich ist??

danke viel mal bereits
 

byte

Top Contributor
Da würde ich mir einfach ein zweites Image erzeugen. Dann kannst Du einfach zurücksetzen, indem Du dem Image dieses Image zuweist.

Code:
Image canvasImage = ...;
Image emptyImage = ...;

...

// image reset
canvasImage = emptyImage;
 
G

Gast

Gast
Die Idee klingt ziemlich logisch, dennoch wird wenn ich das Image immer wieder überschreibe dann jeweils nur ein leeres Image angezeigt. Vermutlich wird es an einer falschen Stelle überschrieben, habe jedoch versucht es an verschiedenen Stellen im Script zu überschreiben.

Wo sollte ich dann am besten
canasImage= emptyImage;

aufrufen??
 

byte

Top Contributor
Gast hat gesagt.:
Die Idee klingt ziemlich logisch, dennoch wird wenn ich das Image immer wieder überschreibe dann jeweils nur ein leeres Image angezeigt.

Ich dachte, das war es, was Du wolltest!? Was meinst Du sonst mit "Canvas zurücksetzen"?
 
G

Gast

Gast
Vileicht habe ich mich schlecht ausgedrückt.

Das mit dem Image funktioniert, jedoch bleiben die Linien welche immer neu gezeichnet werden im Image gespeichert.

D.h. Es soll immer nur die neuste Linie angezeigt werden in der Canvas. Die Linie wird in einer Methode gezeichnet welche alle ca. 300 ms aufgerufen wird.
Damit jeweils immer nur die neuste Linie angezeigt wird, müsste das Image wieder zurückgesetzt werden.

Wenn ich das jedoch so mache wie du mir das erklärtest wird keine Linie mehr angezeigt da sie sofort wieder überschrieben wird.

Ich hoffe es ist verständlicher?

danke
 

byte

Top Contributor
Hm, Du musst doch dann nur vor dem zeichnen einer neuen Linie zuerst wieder das leere Bild zuweisen und dann auf diesem Zeichnen. Und das funktioniert nicht? Zeig mal den aktuellen relevanten Code.
 
G

Guest

Gast
jep:

Code:
public void initialize(Composite parent) {
		canvas = new Canvas(parent, SWT.FLAT);
		canvas.setBounds(0, 265, 730, 350);
		Device display = Display.getDefault();
		emptyImage = new Image(display, 730, 350);
		image = new Image(display, 5, 5);
		gcEvent = new GC(image);
		canvas.addPaintListener(new PaintListener() {
			public void paintControl(PaintEvent e) {
				e.gc.drawImage(image, 0, 0);
			}
		});
	}

und hier wird dann jeweils die Linien in das Image geschrieben:


Code:
public void setContents() {
		pointEndLine = 27;
		pointStartLine = 0;

		for (int i = 1; i < saveRequestTime.size(); i++) {    // Die zu zeichnende Linie wird aus Werten aus dem Array saveRequestTimes gezeichnet
// Wird diese Methode setContents() erneut aufgerufen sollte diese Linie hier komplett neu gezeichnet werden und die alte nicht mehr angezeigt werden.
			pointStartLine = pointEndLine - 7;
			gcEvent
					.drawLine(pointStartLine, // Calculate Coordinates
							(int) (((float) (maxTime - (Long) saveRequestTime
									.get(i - 1)) * oneMiliSecInPix) + 15),
							pointEndLine,
							(int) (((float) (maxTime - (Long) saveRequestTime
									.get(i)) * oneMiliSecInPix) + 15));
			pointEndLine += 7;
		}

		canvas.redraw();
         image = emptyImage;
}


Ich hoffe du kommst draus...
 

byte

Top Contributor
Naja, im moment zeichnest Du in setContents() erst eine Linie und weist dann am Ende das leere Bild zu. Denk mal drüber nach, das ergibt doch keinen Sinn.
 

byte

Top Contributor
Ich dachte, Du wärst mittlerweile selbst drauf gekommen. :roll:

Die Zeile image = emptyImage; muss an den Anfang der Methode setContents() und nicht ans Ende. Im Moment zeichnest Du eine Linie und löscht danach das Bild. Das ist natürlich mehr als sinnfrei. ;)
 
G

Gast

Gast
hm komisch, funktioniert bei mir auch nicht...
habe ich bereits versucht.

Wie genau schreibe ich die Linien in das Image? Habe ich das richtig implementiert (Code)?
 

byte

Top Contributor
Du musst Dir mal angewöhnen, Deine Probleme besser zu schildern. Ein "funktioniert nicht" ist alles andere als aussagekräftig.
 
G

Guest

Gast
sorry :cry:

also es wird immer das leere Image angezeigt und die Linien bekommt man nie zu gesicht...
 

byte

Top Contributor
Wo kommt denn gcEvent her? Das sieht doch sehr spanisch aus. Hol Dir den GC mal vom betreffenden Image, denn dort willst Du ja reinmalen. Also in etwa so:

Code:
public void setContents() {
  image = emptyImage;
  ...
  GC gc = new GC(image);
  gc.drawLine(...);
  ...
  gc.dispose();
  canvas.redraw();
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Regedit JavaFX Java Canvas hört ständig auf zu aktualisieren/malen AWT, Swing, JavaFX & SWT 3
D Canvas soll angezeigtes jpg-Bild aktualisieren AWT, Swing, JavaFX & SWT 4
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
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
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
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
P Inhalt eines Canvas verkleinern AWT, Swing, JavaFX & SWT 3
G Canvas, JMenu, und BufferStrategy AWT, Swing, JavaFX & SWT 2
M Codeteilung -> Canvas zeichnet nicht mehr AWT, Swing, JavaFX & SWT 40

Ähnliche Java Themen

Neue Themen


Oben