Graphics Objekt ändern

Status
Nicht offen für weitere Antworten.

rinc

Mitglied
Hallo,
ich habe ein Problem welches ich einfach nicht lösen kann:

Ich brauche in einem Programm ein Panel mit x mal y Punkten (ca. 200 x 300).
Die Farbe von jedem dieser Punkte soll später geändert werden können.

Unten habe ich zwei java Klassen eingefügt, welche das Problem hoffentlich verdeutlichen.
Natürlich funktioniert das Ganze noch nicht und es ist auch nur ein Ansatz.

Das Konkrete Problem in meinem Versuch ist, dass ich der changeColor(int i, Color c) Methode nicht das Graphics Objekt übergeben kann.
Die Sache wäre einfach wenn man changeColor(int i, Color c, Graphics g ) schreiben könnte.

Hat jemand einen Lösungsvorschlag oder eine bessere Idee?


GraphicsPanel.java
Code:
package Test01;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JPanel;

public class GraphicsPanel extends JPanel {
	private static final long serialVersionUID = 1L;
	private Shape dots[] = new Shape[4];
	private Graphics2D g2;
	
	/**
	 * Zeichnet den Hintergrund und ein paar Punkte
	 */
	public void paintComponent(Graphics g) {
		//alle shapes initialisieren
		Shape rect = new Rectangle2D.Double(0.0, 0.0, 80.0, 80.0);
		dots[0] = new Ellipse2D.Double(20.0, 20.0, 15.0, 15.0);
		dots[1] = new Ellipse2D.Double(20.0, 60.0, 15.0, 15.0);
		dots[2] = new Ellipse2D.Double(60.0, 20.0, 15.0, 15.0);
		dots[3] = new Ellipse2D.Double(60.0, 60.0, 15.0, 15.0);

		//hintergrund zeichnen
		g2 = (Graphics2D) g;
		g2.setColor(Color.red);
		g2.fill(rect);

		//Punkte zeichnen
		g2.setColor(Color.blue);
		g2.fill(dots[0]);
		g2.fill(dots[1]);
		g2.fill(dots[2]);
		g2.fill(dots[3]);
	}
	
	/**
	 * sollte eigentlich die Farbe von einem bestimmten Punkt ändern.
	 * @param i - bezeichnet den entsprechenden Punkt
	 * @param c - die neue Farbe.
	 */
	public void changeColor(int i, Color c) {
		//soll die Farbe von dots[i] aendern!!!
		g2.setColor(c);
		g2.fill(dots[i]);
	}
}

DisplayMain.java
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class DisplayMain implements ActionListener {
	private static DisplayMain displayMain = new DisplayMain();
	private static GraphicsPanel graphicsPanel = new GraphicsPanel();
	
	public static void main(String[] args) {
		JFrame f = new JFrame("Frame");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		//Button zum Testen
		JButton button1 = new JButton("Change Color");
		button1.addActionListener(displayMain);
		f.add(button1, BorderLayout.NORTH);

		//Das Panel mit den Punkten
//		f.add(new GraphicsPanel(), BorderLayout.CENTER);
		f.add(graphicsPanel, BorderLayout.CENTER);
		
		f.setSize(160, 200);
		f.setVisible(true);
	}

	public void actionPerformed(ActionEvent ae) {
		//wenn auf den Button gedrückt wird, soll die Farbe von einem Punkt geändert werden.
		graphicsPanel.changeColor(2, Color.yellow);
	}
}


(Der Sinn dieses Programms ist dass für Optische Experimente die Farbe der einzelnen Punkte sehr schnell geändert werden können soll. )
 

rinc

Mitglied
Die Lösung wäre:

Code:
public void changeColor(int i, Color c, Graphics g) {
		//soll die Farbe von dots[i] aendern!!!
		Graphics2D g2 = (Graphics2D) g;
		g2.setColor(c);
		g2.fill(dots[i]);
	}

nur leider kann die

Code:
public void actionPerformed(ActionEvent ae) {
		//wenn auf den Button gedrückt wird, soll die Farbe von einem Punkt geändert werden.
		graphicsPanel.changeColor(2, Color.yellow);
	}

Methode ja "Graphics g" nicht übergeben


HILFE, BITTE!!!
 

Leroy42

Top Contributor
Du mußt g.setColor(...) in der paintComponent-Methode setzen
und in der actionPerformed-Methode ein repaint() aufrufen:

Etwa so:

Code:
private Color color = Color.red;
...
public void paintComponent(Graphics g) {
  super.paintComponent(g); // Nicht vergessen!
  g.setColor(color);
  ...
}
...
public void actionPerformed(ActionEvent e) {
  color = Color.yellow();
  graphicsPanel.repaint();
}
 

rinc

Mitglied
Danke für deine Antwort,

leider funktioniert das noch nicht so richtig :(
Konkret gibt es folgende Probleme:

1) wenn ich graphicsPanel.repaint(); in der actionPerformed Methode aufrufe, wird alles (der Button und die Grafik) noch mal gezeichnet und zwar etwas nach unten versetzt.
2) wenn ich g.setColor(color); aufrufe werden alle Punkte die danach gezeichnet werden in der entsprechenden Farbe gezeichnet. Der Witz bei dem Programm ist aber dass alle Punkte verschiedene Farben haben können.
3) Da es sehr viele Punkte sind wollte ich außerdem nur einen Punkt neu Zeichen und nicht die ganze Grafik.
4) Wenn möglich wollte ich auch auf ein Array mit einer Farbe für jeden Punkt verzichten, das würde die Sache mit graphicsPanel.repaint(); zwar relativ einfach machen, ist aber nicht der Sinn des Ganzen.

Viele Grüße
rinc
 

rinc

Mitglied
Vielen Dank das war die Lösung!!!

Jetzt funktioniert es, mein Problem ist mit Graphics g = getGraphics(); gelöst:

Code:
public void changeColor(int i, Color c) {
		//soll die Farbe von dots[i] aendern!!!
		Graphics g = getGraphics(); 
		Graphics2D g2 = (Graphics2D) g;
		g2.setColor(c);
		g2.fill(dots[i]);
	}

jetzt gibt es nur noch einen kleinen Haken:
Wenn ich den Punkt neu zeichne, wird er einfach über den schon vorhandenen Punkt gezeichnet, also kann es passieren, dass noch ein paar Pixel in der alten Farbe zu sehen sind. Das ist nicht so schlimm, es wäre aber schöner wenn entweder der alte Punkt vorher gelöst würde oder er einfach mit der neuen Farbe noch mal gezeichnet würde.

Geht das?
 

rinc

Mitglied
Uuups, Du hasst recht, da steht dass man nur in der paint() bzw. paintComponent() Methode zeichnen soll. Aber dann müsste ich ja andauernd die ganze Grafik neu zeichnen und das dauert eindeutig zu lange, nämlich ein paar Sekunden. Ich muss aber ca. 25-mal in der Sekunde neu zeichnen können.
 
S

SlaterB

Gast
niemand behauptet, dass Swing eine leistungsfähige Grafik-Engine ist ;)
25x pro Sekunde ist ja schon Kino-Qualität, kann man die einzelnen Änderungen dann überhaupt alle wahrnehmen oder ein paar zusammenfassen?

du kannst dann natürlich versuchen, mit diversen Tricks trotzdem weiterzukommen,

vielleicht hilft auch das Verfahren 'Zeichnen auf Bild-Objekt + in Paint nur das Bild malen'
 
S

SlaterB

Gast
ja ne GUI, bei der nur alle 5 Sekunden eine Aktualisierung ist,
aber doch wohl kaum geeignet für Halflife oder so,
mit jPanel.repaint() für jedes Frame ;)
 

Wildcard

Top Contributor
Für Spiele muss man active Renering verwenden, da benutzt man kein repaint.
Für 3D spiele ist Swing nicht konzipiert (SWT zB auch nicht). Dafür nimmt man dann Bibliotheken mit OpenGL.
Swing ist ein Toolkit für Desktop Applikationen, und diese Aufgabe erfüllt es jetzt schon hervorragend, und die Entwicklung ist noch lange nicht beended.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
L Graphics Objekt - aus anderer Klasse aufrufen / übergeben AWT, Swing, JavaFX & SWT 5
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
M Graphics-Objekt aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
K Graphics-Objekt zeichnet nicht alle Bilder AWT, Swing, JavaFX & SWT 3
N Graphics Objekt "puffern" AWT, Swing, JavaFX & SWT 7
R Selectable Graphics Objekt gesucht. AWT, Swing, JavaFX & SWT 5
Wildcard FontMetrics ohne Graphics-Objekt AWT, Swing, JavaFX & SWT 13
A Problem mit dem graphics-Objekt AWT, Swing, JavaFX & SWT 8
N Graphics Objekte scalen mit Veränderung des Bildschirms AWT, Swing, JavaFX & SWT 19
T Bild in ein graphics füllen AWT, Swing, JavaFX & SWT 2
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
R AWT Graphics initialisieren AWT, Swing, JavaFX & SWT 15
P JPanle, JFrame und Graphics AWT, Swing, JavaFX & SWT 2
R 2D-Grafik PNG Bild per Graphics auf JPanel AWT, Swing, JavaFX & SWT 9
B Graphics to Image AWT, Swing, JavaFX & SWT 3
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Graphics -> Graphics2D etwas zu beachten? AWT, Swing, JavaFX & SWT 8
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
V Netbeans: TabbedPane, ScrollPane und Graphics AWT, Swing, JavaFX & SWT 4
V Graphics g - drawOval problem mit background AWT, Swing, JavaFX & SWT 1
M Graphics.fillOval AWT, Swing, JavaFX & SWT 1
javampir Sauberes Faden mit awt Graphics AWT, Swing, JavaFX & SWT 6
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
C Zwei Ebenen in Graphics ? AWT, Swing, JavaFX & SWT 0
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
I JavaFX Graphics Performance AWT, Swing, JavaFX & SWT 2
vodkaz Graphics aufrufen AWT, Swing, JavaFX & SWT 4
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
M Graphics.drawImage von unten nach oben abbilden lassen AWT, Swing, JavaFX & SWT 6
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
M JFrame Graphics.drawString Problem AWT, Swing, JavaFX & SWT 11
I Rechteck eines Graphics eines JPanels in einem anderen JPanel anzeigen AWT, Swing, JavaFX & SWT 7
antonbracke Multiplayer Shooter- Wie geht das mit Canvas & Graphics AWT, Swing, JavaFX & SWT 6
R Ankerpunkt bei Graphics AWT, Swing, JavaFX & SWT 3
R Fließende Bewegung von Graphics AWT, Swing, JavaFX & SWT 6
T AWT Graphics G Kein Text erscheint warum? AWT, Swing, JavaFX & SWT 12
L Graphics.drawImage() - Output-Größe entspricht nicht Parametern AWT, Swing, JavaFX & SWT 10
L Border verschwindet durch Graphics.drawImage() AWT, Swing, JavaFX & SWT 4
P "Graphics" wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
B Swing Zeilenumbruch in Graphics AWT, Swing, JavaFX & SWT 20
T Graphics zeichnet nicht AWT, Swing, JavaFX & SWT 2
T Applet graphics - zeichnen funktioniert nicht AWT, Swing, JavaFX & SWT 14
R Graphics-Object speichern AWT, Swing, JavaFX & SWT 4
S Zeichnen mit java.awt.Graphics AWT, Swing, JavaFX & SWT 6
D Graphics zeichnen AWT, Swing, JavaFX & SWT 6
M Graphics auf JFrame Koordinatensystem AWT, Swing, JavaFX & SWT 3
T Graphics Ersetzend Zeichnen AWT, Swing, JavaFX & SWT 6
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
D Erzeugen eines leeren Graphics-Objektes AWT, Swing, JavaFX & SWT 7
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
A AWT AWT Panelfenster mit Graphics kombinieren AWT, Swing, JavaFX & SWT 7
T Graphics Parameterübergabe AWT, Swing, JavaFX & SWT 3
K Graphics.drawImage() sehr schnell AWT, Swing, JavaFX & SWT 5
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
M Graphics.drawImage verlangsamt sich plötzlich AWT, Swing, JavaFX & SWT 15
S Swing AWT (graphics (g)) AWT, Swing, JavaFX & SWT 27
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
B Swing Tooltips auf Graphics AWT, Swing, JavaFX & SWT 8
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Applet mit Graphics dynamisch vergrößern AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
T Swing Component in Graphics zeichnen AWT, Swing, JavaFX & SWT 4
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
E Problem bzw. Sinn von Graphics / Graphics Context AWT, Swing, JavaFX & SWT 21
S Weder ActionListener noch Graphics wollen so recht AWT, Swing, JavaFX & SWT 3
F Methode drawOval(int,int,int,int) von graphics AWT, Swing, JavaFX & SWT 4
G Graphics Objekte in AWT Container einfügen AWT, Swing, JavaFX & SWT 2
S Mit Graphics g ins Fenster zeichnen AWT, Swing, JavaFX & SWT 4
G Graphics - Raute AWT, Swing, JavaFX & SWT 3
G "pinseldicke" bei Graphics? AWT, Swing, JavaFX & SWT 2
G Graphics.drawImage() AWT, Swing, JavaFX & SWT 6
D Methode Graphics g klassenübergreifend nutzen. AWT, Swing, JavaFX & SWT 3
W java.lang.NoClassDefFoundError: org/eclipse/swt/graphics/Dev AWT, Swing, JavaFX & SWT 1
B Graphics und Canvas - Problem AWT, Swing, JavaFX & SWT 2
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
T Transparenz bei Graphics AWT, Swing, JavaFX & SWT 9
L Graphics AWT, Swing, JavaFX & SWT 37
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
Y Problem mit der Referenz eines Graphics-Objekts AWT, Swing, JavaFX & SWT 5
O Graphics erstellt Componente scheinbar nicht richtig AWT, Swing, JavaFX & SWT 23
G 2x Graphics in einer paint() miteinander verbinden AWT, Swing, JavaFX & SWT 11
K Gutes Buch gesucht (Graphics Only) Kennt jemand eins? AWT, Swing, JavaFX & SWT 5
J Einmal gleichzeitig auf zwei Graphics malen? AWT, Swing, JavaFX & SWT 5
E Image, Graphics, verzögert zeichnen AWT, Swing, JavaFX & SWT 2
H neuzeichnen von graphics nach minimierung oder ähnlichem AWT, Swing, JavaFX & SWT 10
G SWT Graphics Zeichnung neu laden AWT, Swing, JavaFX & SWT 13
G SWT Graphics GC Problem AWT, Swing, JavaFX & SWT 6
M Abstrakte Graphics Klasse erzeugen AWT, Swing, JavaFX & SWT 2
H awt Graphics und Image selbermachen ? AWT, Swing, JavaFX & SWT 12
D Image aus Graphics erstellen? AWT, Swing, JavaFX & SWT 2
raptorrs J2D graphics, sind 500px immer 500 px AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben