Seite 1 von 1

public void paint (Graphics g) Anwendungsproblem

Verfasst: 20.04.2013, 19:21
von Terep
Unten habe ich Code gelistet, der reduziert ist.

Das Programm soll ein Rechteck malen.
Methode test1
Der User drückt die Weiter-Meldung.

Das Programm soll ein Rechteck mit anderen Maßen malen.
Methode test2
Der User drückt die Weiter-Meldung.

Das Programm soll ein Rechteck mit anderen Maßen malen.
Methode test3
Der User drückt die Weiter-Meldung.

Das Programm läuft ohne Fehlermeldung.
Das Fenster erscheint aber erst nach der Methode test3.

Was muss ich tun, dass Java jeweils ein Rechteck mit den entsprechenden Maßen malt und dann „weiter“ anbietet.

Für Tipps wäre ich dankbar.

Terep


Code: Alles auswählen


import java.awt.*;
import javax.swing.*;

public class Frames extends JFrame {

	int hoehe;
	int breite;
	
	public Frames () {
		test1();
		test2();
		test3();
}
	
	
	public static void main(String[] args) {
		JFrame frame = new Frames();
		frame.setSize (200, 300);
		frame.setLocation (100, 100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	private void test1	() {
		hoehe = 50;
		breite = 50;
		JOptionPane.showMessageDialog (null, "Weiter");
		repaint();
		
	}
	
	private void test2	() {
		hoehe = 10;
		breite = 90;
		JOptionPane.showMessageDialog (null, "Weiter");
		repaint();
		
	}
	
	private void test3	() {
		hoehe = 100;
		breite = 20;
		JOptionPane.showMessageDialog (null, "Weiter");
		repaint();
		
}
	
	public void paint (Graphics g) {
		g.setColor(new Color (200, 150, 40) );
		g.drawRect(50,  50,  breite,  hoehe);
		repaint();
	}
}


Re: public void paint (Graphics g) Anwendungsproblem

Verfasst: 20.04.2013, 19:42
von Chromanoid
Du rufst die Mal-Funktionen im Konstruktor auf und stellst den Frame dann erst auf sichtbar. Außerdem solltest Du wissen, dass die Grafik des Frames zu unbestimmten Zeitpunkten neu gemalt wird. Das Malen kann also auch wenn du die Funktionen erst später aufrufst übermalt werden. Du solltest die Bilder in einen "Offscreen-Buffer" zeichnen und dann immer nur in den Frame diesen Buffer malen. Also bspw. BufferedImage zum Zeichnen benutzen und das dann via Überschreiben paint/painComponent in den JFrame malen.

Ne gute Game Loop in Java Swing hinzubekommen ist echt schwer. Siehe dazu auch http://forums.tigsource.com/index.php?topic=22054.0 http://www.java-gaming.org/topics/solvi ... /view.html

Re: public void paint (Graphics g) Anwendungsproblem

Verfasst: 21.04.2013, 10:32
von Terep
Chromanoid hat geschrieben:Du rufst die Mal-Funktionen im Konstruktor auf und stellst den Frame dann erst auf sichtbar.

Code: Alles auswählen

import java.awt.*;
import javax.swing.*;

public class Frames extends JFrame {

	int hoehe;
	int breite;
	
	public Frames () {
		setSize (200, 300);
		setLocation (100, 100);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
}
	
	
	public static void main(String[] args) {
		Frames frame = new Frames();
		
		frame.test1();
		frame.test2();
		frame.test3();
	}
	
	private void test1	() {
		hoehe = 50;
		breite = 50;
		JOptionPane.showMessageDialog (null, "Weiter");
		repaint();
		
	}
	
	private void test2	() {
		hoehe = 10;
		breite = 90;
		JOptionPane.showMessageDialog (null, "Weiter");
		repaint();
		
	}
	
	private void test3	() {
		hoehe = 100;
		breite = 20;
		JOptionPane.showMessageDialog (null, "Weiter");
		repaint();
		
}
	
	public void paint (Graphics g) {
		g.setColor(new Color (200, 150, 40) );
		g.drawRect(50,  50,  breite,  hoehe);
		repaint();
	}
}

Das habe ich übersehen und geändert. Es bringt mich ein Schritt weiter. Jeder Testaufruf wird jetzt einzeln gemalt.
Mal sehen, wie weit ich damit komme, bevor eine "Buffer"-Notwendigkeit aufkommt.

Danke

Terep