public void paint (Graphics g) Anwendungsproblem

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Terep
Beiträge: 53
Registriert: 17.01.2008, 21:20
Wohnort: Hannover Region

public void paint (Graphics g) Anwendungsproblem

Beitrag 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();
	}
}

Avatar = „Odyssee im Weltraum“ Film von Stanley Kubrick (Warner Brothers);
nach dem Buch von Arthur C. Clarke. It will becoming true ?!!
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: public void paint (Graphics g) Anwendungsproblem

Beitrag 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
Benutzeravatar
Terep
Beiträge: 53
Registriert: 17.01.2008, 21:20
Wohnort: Hannover Region

Re: public void paint (Graphics g) Anwendungsproblem

Beitrag 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
Avatar = „Odyssee im Weltraum“ Film von Stanley Kubrick (Warner Brothers);
nach dem Buch von Arthur C. Clarke. It will becoming true ?!!
Antworten