paint(G...) auf Abruf

MRS

Mitglied
Hallo zusammen...
lange nicht gesehen und Programmiert :)
Nun da ich wieder angefangen habe stehe ich mal wieder vor einem Problem.

Ich habe zwei Class Dateien.
Die eine soll JFrame übernehmen, die andere Graphics.
Jetzt wollte ich über Buttons in der JFrame-Class "paint" aus der Graphics beeinflussen.

Ist das möglich?

Ich habe schon eine ganze Menge rumgebastelt... vom Konstruktor über Wertübergaben...
Nichts half.

Bitte um Hilfe.

Ich habe meine beiden Dateien in neutraler Button stellung und so simpel wie möglich bei gefühgt zur Übersicht.

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Start extends JFrame implements ActionListener
{
	private static final long serialVersionUID = 1L;
	private JButton bild1Btn = new JButton("Bild 1");
	private JButton bild2Btn = new JButton("Bild 2");
	
	Start()
	{
		super("TestCanvas");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		setSize(660,550);         
		setResizable(false);
		setLayout(null); 
		setVisible(true);

		Grafik graAnzeige = new Grafik();
		graAnzeige.setBounds(10,10,500,500);
		add(graAnzeige);
		bild1Btn.setBounds(520,50,100,20);
		add(bild1Btn);
		bild2Btn.setBounds(520,100,100,20);
		add(bild2Btn);

		bild1Btn.addActionListener(this); 
		bild2Btn.addActionListener(this); 
	}
	public void actionPerformed(ActionEvent e) 
	{     
		Grafik graAnzeige = new Grafik();
		if (e.getActionCommand().equals("Bild 1")) // Linie Gelb
		{       
			graAnzeige.setBounds(10,10,500,500);
			add(graAnzeige);
		}     
		if (e.getActionCommand().equals("Bild 2"))  // Linie Grün
		{        
			graAnzeige.setBounds(10,10,500,500);
			add(graAnzeige);
		}  
	}
	
	public static void main(String[] args) 
	{       
		new Start();
	}
}

Java:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;

public class Grafik extends Canvas
{
	private static final long serialVersionUID = 1L;
	private Graphics painter;
	
	public void zeichne1()
	{
		painter.drawLine(40,250,460,250);
	}

	public void zeichne2()
	{
		painter.setColor(Color.yellow);
		painter.drawLine(40,250,460,250);
	}

	public void zeichne3()
	{
		painter.setColor(Color.green);
		painter.drawLine(40,250,460,250);
	}

	public void paint(Graphics g)
	{
		super.paint(g);
		painter=g;
		zeichne1(); 	// am Anfang Schwarz
		zeichne2();		// bei klicken des "Bild 1" Button Gelb
		zeichne3();		// bei klicken des "Bild 2" Button Grün
	}
}

Die Linie sollte beim Start Schwar sein,
beim klicken des "Bild 1" Buttons Gelb
und beim klicken des "Bild 2" Buttons Grün.

THX
 
Zuletzt bearbeitet:
Kann gerade nicht testen warum es bei dir nicht geht.

Aber mache doch bei Grafik eine Methode setMode(int mode) welche den Modus setzt was gerade gezeichnet werden soll. Also BLACK, GREEN, YELLOW oder so.

Ein Grafik Objekt hinterlegst du als Feld an der Klasse Start und fügst dies auch auf dem Frame hinzu, wie bisher schon.

Beim klicken der Buttons rufst du dann setMode() vom Grafik Objekt auf und setzt den entsprechenden Modus. Im Grafik Objekt überprüfst du beim paint den Modus und zeichnest die entsprechende Linie (switch-case) und damit nach dem drücken des Buttons auch gezeichnet wird, rufst du in dem ActionListener noch redraw auf.

Vllt ein wenig durcheinander, kanns aber gerade wie gesagt nur beschreiben.
 
Ich würde es ähnlich machen.

Der Klasse Grafik fügst du eine Eigenschaft hinzu.

Code:
private Color farbe = null;

und eine weitere Methode zur Klasse Grafik

Code:
public void setFarbe(Color c)
{
  this.farbe = c;
}

Dann kannst du ohne weiteres folgendes unten in deiner paint() - Methode machen

Code:
g,setColor(Color.BLACK);
//zeichen erst das erste


//zeichne, wenn Button gedrückt
g.setColor(this.farbe)
 
Das klappt so schon ganz gut mit den Farbwechseln,
nur will ich in den Methoden zeichne1... noch erweitern um ein paar Linien und Balken.

Daher muss ich die Methoden erhalten aber in unterschiedlichen Farben haben.
Und später sollten sich die Zeichnungen im laufendem Programm ändern.
Also muss ich paint() immer wieder Abfragen.
 
Zuletzt bearbeitet:
Du solltest es doch nicht von da aufrufen. Setzt den Modus an der Klasse die das zeichnen übernimmst. Dieser Modus bestimmt dann ob zeichnen2 oder zeichnen3 aufgerufen wird. Dann führst du ein redraw aus und dadurch wird automatisch die paint Method aufgerufen die dann ja wiederum automatisch je nach modus zeichnen2 oder 3 aufzurufen.
 
Bevor das noch länger dauert....

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Start extends JFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	private JButton bild1Btn = new JButton("Bild 1");
	private JButton bild2Btn = new JButton("Bild 2");
	private Grafik graAnzeige;

	Start() {
		super("TestCanvas");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(660, 550);
		setResizable(false);
		setLayout(null);
		setVisible(true);

		graAnzeige = new Grafik( );
		graAnzeige.setBounds(10, 10, 500, 500);
		add(graAnzeige);
		bild1Btn.setBounds(520, 50, 100, 20);
		add(bild1Btn);
		bild2Btn.setBounds(520, 100, 100, 20);
		add(bild2Btn);

		bild1Btn.addActionListener(this);
		bild2Btn.addActionListener(this);
	}

	public void actionPerformed(ActionEvent e) {

		if (e.getActionCommand( ).equals("Bild 1")) // Linie Gelb
		{
			graAnzeige.setMode(Grafik.MODE2);
			graAnzeige.repaint( );
		}
		if (e.getActionCommand( ).equals("Bild 2")) // Linie Grün
		{
			graAnzeige.setMode(Grafik.MODE3);
			graAnzeige.repaint( );
		}
	}

	public static void main(String[] args) {
		new Start( );
	}
}

Java:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;

public class Grafik extends Canvas {

	private static final long serialVersionUID = 1L;

	public static final int MODE1 = 1;
	public static final int MODE2 = 2;
	public static final int MODE3 = 4;
	public static final int MODE_ALL = 16;

	private int mode = MODE1;

	public void setMode(int mode) {
		this.mode = mode;
	}

	public void zeichne1(Graphics g) {
		g.drawLine(40, 250, 460, 250);
	}

	public void zeichne2(Graphics g) {
		g.setColor(Color.yellow);
		g.drawLine(40, 250, 460, 250);
	}

	public void zeichne3(Graphics g) {
		g.setColor(Color.green);
		g.drawLine(40, 250, 460, 250);
	}

	public void paint(Graphics g) {
		super.paint(g);

		switch (mode) {
			case MODE1:
				zeichne1(g);
				break;
			case MODE2:
				zeichne2(g);
				break;
			case MODE3:
				zeichne3(g);
				break;
			case MODE_ALL:
				zeichne1(g);
				zeichne2(g);
				zeichne3(g);
				break;
		}
	}
}
 
Wow... so Umständlich wird das dann?
Kein Wunder das ich da nicht drauf komm.

Ich danke dir Vielmals zeja für die große Mühe. :p

Echt... da wäre ich nie drauf gekommen.
 
Zurück