2D-Grafik Neue Farbe für einen Teilbereich einer Linie?

piplack

Mitglied
Hallo,

in einem Panel zeichne ich horizontale und vertikale Linien. Ich möchte, wenn der User auf einen bestimmten Bereich klickt, dass dieses Linienstück eine andere Farbe bekommt.

Wie kann ich dies anstellen?
Habe es schon mit repaint() versucht, aber leider klappt das nicht.

Klasse Spielfeld: Hier werden die Grundlinien gezeichnet, das klappt auch wunderbar

Java:
public class Spielfeld extends JPanel implements MouseListener {

	private int anzahlKaestchen;
	private int panelgroesse;
	private int abstand;
	private int index;
	private int rand;
	private Spiel spiel;
	private Spieler s;
	private String symbol;
	private Graphics g;

	
	
	public int getAnzahlKaestchen() {
		return anzahlKaestchen;
	}

	public void setAnzahlKaestchen(int anzahlKaestchen) {
		this.anzahlKaestchen = anzahlKaestchen;
	}

	public Spielfeld() {

		addMouseListener((MouseListener) new Startcontroller(this));
	}

	/**
	 * Methode, um die Linien zu zeichnen
	 * 
	 * @author Anke
	 * @param anz
	 *            = Anzahl der Kästchen in der Breite bzw. in der Höhe
	 * @param g
	 *            = Grafik-Spielfeld
	 */
	public void spielfeldZeichnen(int anz, Graphics g) {
//		panelgroesse = getHeight()-2;
//		panelgroesse = Startview1.getPanelgroesse();
		panelgroesse = 180;
		anzahlKaestchen = 4;

		int breite = Integer.parseInt((String) Startview1.getBreite().getSelectedItem());
		
		if (breite != anzahlKaestchen) {
			anzahlKaestchen = breite;
		}
		else {
			anzahlKaestchen = anzahlKaestchen;
		}
		System.out.println("Kästchenbreite = " + anzahlKaestchen);
		System.out.println("Panelgroesse = " + panelgroesse);
		
		abstand = panelgroesse / anzahlKaestchen;
		Spiel spiel;

		// horizontale Linien
		for (int y = 0; y <= (panelgroesse); y += abstand) {
			g.drawLine(0, y, panelgroesse, y);
		}

		// vertikalen Linien
		for (int x = 0; x <= (panelgroesse); x += abstand) {
			g.drawLine(x, 0, x, panelgroesse);
		}
		this.g = g;
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		spielfeldZeichnen(anzahlKaestchen, g);
//		paintSpielzug(index, rand, getG());
	}

	//getter + setter für g
	public Graphics getG() {
		return g;
	}

	public void setG(Graphics g) {
		this.g = g;
	}

....

	/**
	 * Die Methode 'paintSpielzug' setzt den angeklickten Rand in eine andere Farbe
	 * @param index = Index vom Kästchen
	 * @param rand = Index vom Rand
	 * @author Anke
	 */
	public void paintSpielzug(int index, int rand, Graphics g) {
		int i = getIndex();
		int r = getRand();
		g = getG();
		
		Color farbe = Color.BLUE;
		
		float a;
		float b;

		a = Startcontroller.getKlick().getX() / abstand;
		b = Startcontroller.getKlick().getY() / abstand;
		
		int xa = (int) (a * abstand);
		int yb = (int) (b * abstand);
		int xa2 = xa + abstand;
		int yb2 = yb + abstand;
		
		System.out.println("Rand= "+rand);
		System.out.println("xa = " + xa);
		System.out.println("yb = " + yb);
		System.out.println("x2a = " + xa2);
		System.out.println("yb2 = " + yb2);
		
		if (r == 0) {
			g.setColor(farbe);
			g.drawLine(xa, yb, xa2, yb);
		}
		else if (r == 1) {
			g.setColor(farbe);
			g.drawLine(xa2, yb, xa2, yb2);
		}
		else if (r == 2) {
			g.setColor(farbe);
			g.drawLine(xa, yb2, xa2, yb2);
		}
		else {
			g.setColor(farbe);
			g.drawLine(xa, yb, xa, yb2);
		}
		this.g = g;
		
		System.out.println("Die Funktion paintSpielzug wird aufgerufen!");
	}

Die Methode wird auch aufgerufen, aber in der View ist leider keine Änderung.

In der Controller-Klasse ist der Mouse-Listener, der dann das neuzeichnen aktivieren sollte

Java:
public class Startcontroller implements ActionListener, MouseListener{

	private Startview1 startview1;
	private Startmodel startmodel;
	private Spielfeld spielfeld;
	
	private int x;
	private int y;
	
	private static Punkt klick;
	private static Punkt kaestchenKoordinate;

	public Startcontroller(Startview1 startview1) {
	this.startview1 = startview1;	
	}
	
	public Startcontroller(Spielfeld spielfeld) {
	this.spielfeld = spielfeld;
	}

	public Startmodel getStartmodel() {
		return startmodel;
	}

	public void setStartmodel(Startmodel startmodel) {
		this.startmodel = startmodel;
	}

	public Startview1 getStartview1() {
		return startview1;
	}

	public void setStartview1(Startview1 startview1) {
		this.startview1 = startview1;
	}
	
	public Spielfeld getSpielfeld() {
		return spielfeld;
	}

	public void setSpielfeld(Spielfeld spielfeld) {
		this.spielfeld = spielfeld;
	}

//ActionListener rausgenommen)
	
	// Mouseevent fuer Namensfelder
	public void mouseClicked(MouseEvent event) {
		if (event.getSource() instanceof TextField) {
			if (((TextField) event.getSource()).getName() == "Spieler1") {
				Startview1.getSpieler1().setText("");
			} 
			else if (((TextField) event.getSource()).getName() == "Spieler2") {
				Startview1.getSpieler2().setText("");
			}
		}
		if (event.getSource() instanceof JPanel) {
			klick = new Punkt(event.getX(), event.getY());
			int i = spielfeld.berechneKaestchenIndex(klick);
			int rand = spielfeld.berechneRandIndex(klick, kaestchenKoordinate);
			Graphics g = spielfeld.getG();
			
		System.out.println("Kästchen-Index = "+ i + " x= "+ event.getX()+ " Y= "  + event.getY());
		
		spielfeld.berechneRandIndex(klick, kaestchenKoordinate);
		
		spielfeld.paintSpielzug(i, rand, g);
		spielfeld.repaint();   //funktioniert nicht
		}
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		e.getX();
		e.getY();
//		System.out.println(e.getX() + "  "+ e.getY());
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public static Punkt getKlick() {
		return klick;
	}

	public void setKlick(Punkt klick) {
		this.klick = klick;
	}

}
 

Blakh

Bekanntes Mitglied
Hm habe jetzt nicht richtig mich da reingearbeitet, aber ich würd doch erstmal schauen, ob das MouceClickEvent ausgelöst wird (einfaches syso von dem event z.b.).
 

Michael...

Top Contributor
in einem Panel zeichne ich horizontale und vertikale Linien. Ich möchte, wenn der User auf einen bestimmten Bereich klickt, dass dieses Linienstück eine andere Farbe bekommt.

Wie kann ich dies anstellen?
Ganz einfach: Eine andersfarbige Linie darübermalen ;-)

1. Anwender klickt
2. Bereich ermitteln
3. per repaint() ein Neuzeichnen der Komponente anfordern
4. in der paintComponent die Standardlinien zeichnen
5. (immer noch in der paintComponent) prüfen, ob ein Bereich gesetzt ist und falls ja, die andersfarbigen Linien in diesem Bereich zeichnen
 

piplack

Mitglied
Kannst Du zu 5 etwas ausführlicher werden?

die Methode paintSpielzug wird über den MouseListener aufgerufen.

in dieser Methode wird auch der Bereich ermittelt, wo ich die Linie neue Zeichnen will.
es wird auch aufgefordert, einen bestimmte Linie zu zeichnen.

wo muss ich das repaint() setzen,
und wie kann überprüfen, ob ein Bereich andersfarbig ist?

Methode paintSpielzug() wird aufgerufen, habe ich ausprobiert mit sysout....
 
Zuletzt bearbeitet:

Blakh

Bekanntes Mitglied
Hm kann es sein, dass du den Spielzug zeichnest, dann aber wieder mit der repaint() das Spielfeld drüber gezeichnet wird?
 
S

SlaterB

Gast
das Graphics-Objekt nicht längerfristig speichern, etwa im MouseListener abfragen,
es gibt (im einfachen Modell) nur paintComponent() welches g liefert, damit malen, wie auch immer, nur wenige ms insgesamt,
danach NICHTS mehr mit diesem g machen, für die Zeit kann es natürlich zur Vereinfachung in diversen Variablen abgelegt werden,
Parameter für Methoden usw.,

auf User-Ereignisse repaint(), damit das ganze von vorne los geht
und die reine Information abspeichern,
notfalls [c]boolean maleLinieVonX40Y50NachX60Y70Blau = true/false; [/c]
aber das ist wohl nicht allgemein genug..,
also irgendwas modellieren, z.B. ein Objekt mit Wahl der Linie, Wahl der Farbe, welches beim painten dann am Ende berücksichtigt wird,
trivial ist das nicht, das ganze Bild muss irgendwie ansprechbar sein, z.B. die Linien von 0-999 durchnummieren,
anhand der Mausklickposition die näheste berechnen/ bestimmen..
 

Michael...

Top Contributor
Oh, das mit dem Graphics Objekt sollte man natürlich nicht machen.

Hier mal ein Q&D Beispiel, wie man an die Sache rangehen könnte. Die geklickte "Koordinate" wird in einem Point gespeichert bzw. beim Loslassen wird die Referenz auf null gesetzt.
In der paintComponent wird überprüft, ob die Variable auf ein Objekt referenziert, wenn ja wird anhand der "Koordinate" die Position ausgereichnet und an dieser Stelle ein farbiges Rechteck gemalt.
Java:
class PaintPanel extends JPanel implements MouseListener{
	private int rows = 4, columns = 4;
	private BasicStroke stroke = new BasicStroke(3);
	private Point p;
	
	public PaintPanel() {
		this.addMouseListener(this);
		p = null;
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D)g;
		g2.setStroke(stroke);
		int w = this.getWidth(), h = this.getHeight();
		int dH = h/columns;
		for (int r=0; r<=rows; r++)
			g2.drawLine(0, r*dH, w, r*dH);
		int dW = w/rows;
		for (int c=0; c<=columns; c++)
			g2.drawLine(c*dW, 0, c*dW, h);
		if (p!=null) {
			g2.setColor(Color.YELLOW);
			g2.drawRect(p.x*dW, p.y*dH, dW, dH);
		}
	}
	public void mouseClicked(MouseEvent e) {}
	public void mouseEntered(MouseEvent e) {}
	public void mouseExited(MouseEvent e) {}
	public void mousePressed(MouseEvent e) {
		p = new Point(e.getX()*columns/this.getWidth(),
			e.getY()*rows/this.getHeight());
		this.repaint();
	}
	public void mouseReleased(MouseEvent e) {
		p = null;
		this.repaint();
	}
}
 

piplack

Mitglied
Das funktioniert leider auch nicht.

ich muss den MouseListener in einer anderen Klasse (Startcontroller) setzen.
Dadurch will er, dass die getPoint() als static declariert sein soll, wird aber in Java leider nicht angenommen.
 
S

SlaterB

Gast
weder reichen diese Zeilen um dein Programm zu korrigieren (was sowohl statisch als auch nicht-statisch immer möglich ist, man muss es nur richtig machen)
noch wird jemand aus reinem Jux einen anderen oder sonst wie besseren/ vollständigeren Code posten

die Frage die sich stellt lautet also: was willst du mit deinem Posting aussagen?
(außer eine Antwort wie die meine heraufzubeschwören? ;) )
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I JLabel neue Zeile AWT, Swing, JavaFX & SWT 4
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
D Mit Jmenu neue JFrame öffnen AWT, Swing, JavaFX & SWT 2
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
boscho87 JavaFX Variabeln an neue Scene übergeben AWT, Swing, JavaFX & SWT 0
D JLabel bei Aufruf neue Zeile AWT, Swing, JavaFX & SWT 5
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
M Swing JFreechart zoom x-achse neue Werte AWT, Swing, JavaFX & SWT 4
F Swing String[] in JTextArea ausgeben. Jeder Eintrag in neue Zeile, aber ohne "\n"- Geht das? AWT, Swing, JavaFX & SWT 3
Birke Swing Neue Swing LayoutManager: TOnion Projekt AWT, Swing, JavaFX & SWT 10
J JavaFX Variable an neue Scene übergeben AWT, Swing, JavaFX & SWT 8
S JTable nach aktualisierung - neue Zeile nicht "klickbar" AWT, Swing, JavaFX & SWT 0
S Oracle's neue Sicherheitseinstellungen zerstoeren mein Applet. Was tun? AWT, Swing, JavaFX & SWT 3
P Neue Datei erstellen in JPanel AWT, Swing, JavaFX & SWT 5
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
windl Querstreifen beim Bilder malen und anpassen an neue CPU AWT, Swing, JavaFX & SWT 12
C Neue Benutzeroberfläche einfügen? AWT, Swing, JavaFX & SWT 12
C Swing Fensterresize durch doppelklick - wie die neue Grösse erhalten? AWT, Swing, JavaFX & SWT 3
E JFreeChart in einer dynamischen Aufzeichnung neue Serien hinzufügen? AWT, Swing, JavaFX & SWT 7
K Buttons und neue Fenster AWT, Swing, JavaFX & SWT 9
V Swing Neue Größe bei ComponentListener noch nicht verfügbar? AWT, Swing, JavaFX & SWT 3
Meldanor Swing JTable - Eine neue Zeile vor einer bestehenden Einfügen AWT, Swing, JavaFX & SWT 2
C Swing JLabels entfernen und neue einfügen AWT, Swing, JavaFX & SWT 6
J Swing JList: Neue Zeilen mit fireIntervalAdded sind automatisch selektiert AWT, Swing, JavaFX & SWT 2
C AWT Über Pulldownmenü neue Javadatei öffnen AWT, Swing, JavaFX & SWT 7
E In JTable neue Zeile mit Tabulator einfügen AWT, Swing, JavaFX & SWT 5
G Swing JFileChooser Event für neue Directory? AWT, Swing, JavaFX & SWT 5
M Main Frame schließen und neue Klasse aufrufen? AWT, Swing, JavaFX & SWT 2
P Eigenes TableModel abgeleitet von AbstractTableModel (neue rows nicht sichtbar) AWT, Swing, JavaFX & SWT 6
S [Swing] Wie zeichne ich neue Linien AWT, Swing, JavaFX & SWT 3
R Innerhalb der GUI Klasse meine neue Klasse aufrufen AWT, Swing, JavaFX & SWT 1
4 Neue Fensterinhalte kommen nicht im selben Fenster AWT, Swing, JavaFX & SWT 5
D JLabel o.a. im Swing Fenster löschen um neue JL. zu zeigen AWT, Swing, JavaFX & SWT 4
R JFileChooser (neue Instanzen bei Mehrfachauswahl?) AWT, Swing, JavaFX & SWT 6
G Oberfläche löschen und neue erstellen AWT, Swing, JavaFX & SWT 4
S int-berechnung des RGB-Wertes ohne neue Instanz? AWT, Swing, JavaFX & SWT 9
S MVC - Neues Frame, neue View, neuer Controller? AWT, Swing, JavaFX & SWT 3
Icewind Jlist zeigt neue elemente im model nicht sofort an AWT, Swing, JavaFX & SWT 3
Icewind JTable zeigt neue elemente im model nicht sofort an AWT, Swing, JavaFX & SWT 3
O der neue eclipse 3.1 splash screen AWT, Swing, JavaFX & SWT 3
P JComboBox: Items löschen und neue hinzufügen. AWT, Swing, JavaFX & SWT 3
G Neue Komponente erstellen - Fragen/Probleme mit MouseEvents AWT, Swing, JavaFX & SWT 2
J JTextArea + neue Zeile AWT, Swing, JavaFX & SWT 9
R JFrame oder Frame für neue GUI? AWT, Swing, JavaFX & SWT 2
H Neue Instanz einer Klasse bei JButton-Klick AWT, Swing, JavaFX & SWT 5
S Neue Zeile in JTable adden AWT, Swing, JavaFX & SWT 3
H JavaFX PixelWriter.setColor setzt Farbe nicht AWT, Swing, JavaFX & SWT 2
F Progressbar Farbe AWT, Swing, JavaFX & SWT 6
jojoge Wie erstelle ich runde Buttons mit Farbe? AWT, Swing, JavaFX & SWT 1
Kotelettklopfer Frame ändert Farbe nicht AWT, Swing, JavaFX & SWT 12
Hatsi09 GUI Input Farbe ändern AWT, Swing, JavaFX & SWT 0
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
F Drag&Drop mit Transparenter Farbe bei PNG AWT, Swing, JavaFX & SWT 0
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich die helle geklickt-Farbe von einem JButton? AWT, Swing, JavaFX & SWT 4
H JFreeChart BarDiagramm Balken der gleichen Serie unterschiedliche Farbe zuordnen AWT, Swing, JavaFX & SWT 2
cool_brivk24 Swing Button Farbe ändern AWT, Swing, JavaFX & SWT 2
R Farbe zu einem Eckpunkt generieren AWT, Swing, JavaFX & SWT 2
MaxG. Swing Farbe von Button beim drücken ändern AWT, Swing, JavaFX & SWT 4
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
W Farbe des Fensters AWT, Swing, JavaFX & SWT 2
krgewb Swing JTree - Farbe von nodes ändern AWT, Swing, JavaFX & SWT 4
M Ausgabe der HSL oder RGB Zusammensetzung einer Farbe (JColorChooser AWT, Swing, JavaFX & SWT 1
J JavaFX Bestimmte Zellen im TableView ändern (Farbe und Text) AWT, Swing, JavaFX & SWT 1
Z Möglichkeit mit Listerners die Farbe meiner Objekte zu ändern AWT, Swing, JavaFX & SWT 15
K (GUI) JButton Farbe bei druck ändern AWT, Swing, JavaFX & SWT 3
C Arrow Farbe bei JComboBox AWT, Swing, JavaFX & SWT 2
S Größe und Farbe vom JButton festlegen AWT, Swing, JavaFX & SWT 2
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
V LookAndFeel JSpinner Hintergrund Farbe mit Nimbus LaF AWT, Swing, JavaFX & SWT 0
X mouseover verändert ungewollt die farbe AWT, Swing, JavaFX & SWT 4
D Swing Farbe aus Pixel vom JFrame auslesen AWT, Swing, JavaFX & SWT 17
T Swing JScrollPane Farbe der Scrollbar AWT, Swing, JavaFX & SWT 3
J Swing Farbe wählen ohne JColorChooser 2 AWT, Swing, JavaFX & SWT 23
S Farbe von JButton ändern AWT, Swing, JavaFX & SWT 5
T Jbutton Click farbe ändern AWT, Swing, JavaFX & SWT 4
C AWT Wie setze ich die Farbe "leuchtetgrün"? AWT, Swing, JavaFX & SWT 4
B Swing Button Farbe AWT, Swing, JavaFX & SWT 3
M Hover-Farbe über Hintergrundfarbe legen AWT, Swing, JavaFX & SWT 3
N Farbe abziehen AWT, Swing, JavaFX & SWT 3
R Farbe von Buttons stimmt nicht AWT, Swing, JavaFX & SWT 2
B Cursor Farbe ändern AWT, Swing, JavaFX & SWT 6
Y LookAndFeel JTabbedPane: Tab-Farbe mit Nimbus setzen AWT, Swing, JavaFX & SWT 3
T DefaultTableCellRenderer Farbe bestimmter Zelle ändern AWT, Swing, JavaFX & SWT 2
D JComboBox jedes Item mit einer anderen Farbe AWT, Swing, JavaFX & SWT 10
P JLabel Farbe/Bild ändern aus MouseListener heraus AWT, Swing, JavaFX & SWT 3
K 2D-Grafik Fehler beim Farbe auslesen AWT, Swing, JavaFX & SWT 3
T JTable Zellen Farbe AWT, Swing, JavaFX & SWT 13
D JTabel: Überschrift, Abstand zwischen Tabellen, Spalten-Farbe ändern AWT, Swing, JavaFX & SWT 2
D Swing JTable, Zellen-Farbe über Koordinaten ändern AWT, Swing, JavaFX & SWT 9
N SWT-Widgets in Farbe AWT, Swing, JavaFX & SWT 21
F JButton Text-Farbe bei Disabled AWT, Swing, JavaFX & SWT 2
C Farbe eines ToolTipTextes eines Buttons AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben