Initialisierung von Zeichenpanel

beastofchaos

Bekanntes Mitglied
Hallo Leute,
Ich arbeite im Moment an einem Zeichenprogramm. Leider hänge ich an einer Sache ein bisschen.
Mein Problem ist, dass mein Zeichenpanel (PaintPanel) zu langsam lädt. Denn es soll bei der Initialisierung schon ein weißes Bild drauflegen, auf das dann gemalt wird. Aber in diesm Moment (wo das erste/zweite Mal paintComponent() zur Initialisierung aufgerufen wird) ist das Panel noch nicht ganz geladen. Dabei hab ich aber eingestellt, dass das Bild die Größe des Panels nehmen soll. Aber das unvollständige Panel besitzt in dem Momment die Größe 0-0 oder ein bisschen größer, da es beim Laden ist. Ich zeig euch am besten mal den relevanten Quelltext:

Der Aufruf des PaintPanels:
Java:
public final class Main extends JFrame{   
    
    public PaintPanel paintPanel = new PaintPanel(this);
    ...
    
    static public void main(String [] args) {
    	try {
    	    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
	    Main frame = new Main();
	    ...
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

paintComponent() von PaintPanel:
Java:
if (paints == null){
			SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					paints = new ImageDesign();
					paints.setObserver(PaintPanel.this);
					paints.setImage(new BufferedImage(PaintPanel.this.getWidth() - 3,PaintPanel.this.getHeight() - 3, BufferedImage.TYPE_INT_RGB));
					paints.setSize(new Point(paints.getImage().getWidth(paints.getObserver()), paints.getImage().getHeight(paints.getObserver())));
					Graphics tempGC = paints.getImage().getGraphics();
					tempGC.setColor(Color.white);
					tempGC.fillRect(0, 0, PaintPanel.this.getWidth(), PaintPanel.this.getHeight());
					inited = true;
				}
			});
		}
		else{
			draw(g);
		}


ImageDesign() - benötigte Methoden:
Java:
public class ImageDesign extends Design {
	private Image image;
	private PaintPanel observer;

	public ImageDesign() {
		super();
		this.image = null;
	}

	public void setObserver(PaintPanel anObserver) {
		observer = anObserver;
	}
	public PaintPanel getObserver(){
		return this.observer;
	}
	
	public void setImage(Image anImage) {
		if (anImage == null){
			this.image = anImage;
			JOptionPane.showConfirmDialog(null, "Die Ablage enthält kein Bild!", "Bild einfügen - Fehlermeldung", JOptionPane.DEFAULT_OPTION);
		}
		else {
			this.image = anImage;
			setSize(new Point(anImage.getWidth(observer), anImage.getHeight(observer)));
		}
	}
	public Image getImage(){
		return this.image;
	}
	
	public void addImage(BufferedImage anImage){
		Graphics g = getImage().getGraphics();
		g.drawImage(anImage, 0, 0, observer);
	}
	
	public void add(Design des){
		try {
			des.draw(getImage().getGraphics());
		}
		catch (NullPointerException e){ }
	}
	
	@Override
	public void draw(Graphics g) {
		g.drawImage(image, getLocation().x, getLocation().y, observer);
	}

Die Oberklasse Design enthält nur relevante Methoden wie setSize(), womit dann später gezeichnet wird. Das brauche ich aber nicht auch noch vorhalten ;)

Wie ihr sehen könnt, benutzte ich bisher für diese Problem ein SwingUtilities.invokeLater(), was leider auch nicht 100%ig funktioniert. Ich schätze mal jedes 10./15. Mal kommt eine graue Oberfläsche - sprich kein geladenes Bild. Wenn ich dann zeihcne, wird das automatisch neu gemacht, aber unter sowas stelle ich mir kein schönes Zeichenprogrmam vor :D
Dadurch wird brigens ncoh ein weiterer Fehler produziert, der jedesmal auftaucht. Und zwar benuzte ich für die Farbauswahl ein JColorChosser, welches per JSplitPane an das PaintPanel gekoppelt ist. Zwar wird das nach dem Konstruktor für das PaintPanel aufgerufen, aber trotzdem sieht man am Anfang für einen Moment, dass die ColorChooser-Seite des SplitPanes fast alles einnimmt. Erst wenn nach ca. einer viertel/halben das PaintPanel geladen ist und seine totale Größe erreicht hat, verschiebt sich auch das SplitPane entsprechend. Wisst ihr vll. eine bessere Lösung, mit der erst alles angezeigt wird, wenn wirklich alles geladen ist?
Dazu hätte ich nur die Idee, ein Timer in ders tatischen main-Methode einzubauen, der das Frame solange unsichtbar hält, bis das PaintPanel seine volle Größe hat. Das würde zumindest das SplitPane-Problem lösen, wenn auch meiner Meinung anch unsschön... :/

Gruß, Thomas
 

diggaa1984

Top Contributor
ich hatte letztens genau das gleiche Problem, bei mir war es allerdings so, dass ich einen extra Thread laufen hatte, welcher die Zeichnung jeweils aktualisiert hat (alle 30ms ca.).

Diesen hatte ich dann gestartet nachdem alle Initialisierungen fertig waren.

Weiterhin solltest du noch wie folgt in der main-Methode dein Fenster erstellen (ebenfalls im EDT):
Java:
SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        Main frame = new Main();
        frame.setVisible(true);
    }
});

Bei mir hatte ich dann danach die Zeichnung angeworfen, und es ging. Vielleicht kannst du etwas ähnliches realisieren.
 

beastofchaos

Bekanntes Mitglied
Darauf hätt ich auch mal kommen müssen :p Hab das invokeLater nun auch beim Alles-erstellen eingebaut und das Problem "SplitPane" ist behoben. Das andere ist seit längerem nciht mehr aufgetaucht :D

Dankeschön,
vll. wäre dafür wirklich ein Timer nicht schlecht. Im Moment schaltet sich nur einer ein, wenn ich in den Auswählmodus gehe, wo er eine gestrichelte Linie über einen Bereich legt und die Linie andauernd bewegt. Das repaint(), was darin aufgerufen wird, kann sich mit dem in mouseDragged überschneiden und unnötige Ressourcen verwenden xD Ich werd mcih mal ranhocken.
Und am Ende kriegt ihr alle das Programm von mir hier gepostet und könnt mir Tipps für Verbesserungen geben ;)

Gruß und Dankeschön, Thomas
 

beastofchaos

Bekanntes Mitglied
Hatte jetzt das Problem mit dem unvollständigen Laden 2mal wieder, also lass ich jetzt am Anfang per Timer 5 Mal neu zeichnen, damit es wirklich funktioniert
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
S If Abfrage nur mit bestimmter Initialisierung? Java Basics - Anfänger-Themen 8
B Klassen Ungültige Objektzustände bei der Initialisierung Java Basics - Anfänger-Themen 2
A OOP und Initialisierung Java Basics - Anfänger-Themen 5
J Klassen Deklaration und Initialisierung Java Basics - Anfänger-Themen 15
N Methode mit While-Schleife und If-Bedingung und Array-Initialisierung Java Basics - Anfänger-Themen 4
T Erste Schritte Frage zur Initialisierung eines Mehrdimensionalen Arrays Java Basics - Anfänger-Themen 3
R Erste Schritte Deklaration und Initialisierung von Arrays Java Basics - Anfänger-Themen 21
A Variablen Variable soll ihren Wert nach Initialisierung nicht mehr ändern Java Basics - Anfänger-Themen 2
M Interpreter-Fehler Nullpointerexception trotz Ordentlicher Initialisierung Java Basics - Anfänger-Themen 4
M Deklaration und Initialisierung bei Method Erstellung Java Basics - Anfänger-Themen 12
E Initialisierung von Attributen und Konstruktor Java Basics - Anfänger-Themen 0
F Erste Schritte Frage zur Initialisierung Java Basics - Anfänger-Themen 4
S Initialisierung von Klassenvariablen Java Basics - Anfänger-Themen 7
D Problem mit Initialisierung und Reihenfolge Java Basics - Anfänger-Themen 10
J Initialisierung Array-Liste Java Basics - Anfänger-Themen 3
S Object Initialisierung Java Basics - Anfänger-Themen 7
F Variable ohne Initialisierung in For Schleife Java Basics - Anfänger-Themen 5
D Datentypen Felder: Deklaration und Initialisierung Java Basics - Anfänger-Themen 5
Luk10 Saubere Initialisierung im Konstruktor Java Basics - Anfänger-Themen 4
M Variablen Initialisierung von Arrays Java Basics - Anfänger-Themen 7
K Datentypen Default Initialisierung Java Basics - Anfänger-Themen 8
P Initialisierung einer 5*5 Matrix mit best. Werten Java Basics - Anfänger-Themen 2
V Datentypen Array Initialisierung funktioniert nicht Java Basics - Anfänger-Themen 3
B Fragen zur Initialisierung/Zuweisung der Variable + Packages erstellen Java Basics - Anfänger-Themen 4
S jTree initialisierung Java Basics - Anfänger-Themen 4
G Initialisierung + alte Werte Java Basics - Anfänger-Themen 7
F "Initialisierung der VM fehlgeschlagen. res=-4 jvm is n Java Basics - Anfänger-Themen 5
P Grundsätzliches zur String-Initialisierung Java Basics - Anfänger-Themen 2
M String Initialisierung Java Basics - Anfänger-Themen 5
tobiasbeil Fehler array initialisierung. Nur erklärung bitte. Java Basics - Anfänger-Themen 2
T Unterschied Initialisierung von Klassen Java Basics - Anfänger-Themen 3
H String initialisierung Java Basics - Anfänger-Themen 9
A array nach initialisierung final machen? Java Basics - Anfänger-Themen 17
M Initialisierung Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben