Repaint() in Schleifen, Threads

rix

Mitglied
Immer noch der Noob hier. Ich arbeite immer noch an meinem Mandelbrot-Programm. Weil das Ding bei großen Auflösungen extrem lange braucht, möchte ich das Bild in Stücken malen (damit die User sehen, dass es voran geht und das Programm sich nicht verabschiedet hat. Das geht, an und für sich, mit einem repaint(xstart,ystart,width,height:int).

Aber das geht nicht in Schleifen, wegen eines Threadproblems (ich denke, ich hab nur so halb verstanden, worum es dabei geht).

Ich habe versucht, das ganze mal runterzubrechen. In dem folgenden Programm sollten am Ende mehrere Rechtecke nebeneinander erscheinen, nachdem geklickt wurde (in diesem Fall ginge das natürlich auch durch eine Schleife in der paint-Methode, aber das ist ja nicht das Ziel des ganzen :) ).

Könnt ihr mir bitte erklären, was ich falsch mache?

(Oder mir hilfreiche Rückfragen stellen, oder so; bin für jede Hilfe dankbar.)

Java:
package test1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
 
/**
* @author rix
*
**/
public class Test1 extends JPanel implements MouseListener{
   
    public static void main(String[] args) {
        Test1 mandel;
        mandel = new Test1();
    }
   
    /* Global vars */
    private int width;
    private int height;
    private int xwidth,yheight,xstart,ystart;
    private JFrame frame;
    
     
    Test1(){
        
        width = 400;
        height = 300;
        
        xstart = 50;
        ystart = 50;
        yheight = 250;
        xwidth = 100;
        
        /* Generate Frame */
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new MyComponent());
        frame.setSize(width, height);
        frame.getContentPane().setBackground(Color.BLACK);
        frame.addMouseListener(this);
       
        frame.setVisible(true);
        
    }
 
    /*Mouse event*/
    @Override
    public void mouseClicked(MouseEvent me) {  
        
        myRepaint();
        
    } 
    
    @Override
    public void mousePressed(MouseEvent me) {    }
 
    @Override
    public void mouseReleased(MouseEvent me) {    }
 
    @Override
    public void mouseEntered(MouseEvent me) {    }
 
    @Override
    public void mouseExited(MouseEvent me) {    }
 
 
    class MyComponent extends JComponent {
 
        @Override
        public void paintComponent(Graphics g) {
           
            super.paintComponent( g );
            Graphics2D g2 = (Graphics2D) g;
           
            g2.setColor(Color.RED);
            g2.drawRect(xstart,ystart,xwidth,yheight);
          
        } 
    
    } 
    
    public void myRepaint() {
            
            new Thread(){
                @Override
                public void run() {
                    while (xstart <= width) {
                    xstart += xwidth+1;
                    frame.repaint(xstart,ystart,xwidth+3,yheight+1);
                    }
                
                }
                
            }.start();
            
            
        }
}
 
V

vanny

Gast
gib doch mal ein paar sysouts dazu, dann wirst du merken, das dein Thread garnichts tut.^^
 

rix

Mitglied
Wie meinst Du das? Alles, was in run() steht, wird ja ausgeführt. Nur wird repaint() nach wie vor nicht sofort ausgeführt, sondern wie immer erst nachdem die Schleife durch ist.
 
V

vanny

Gast
Ich verstehe auch deine Innerclass nicht ganz.
Mal ein Beispiel, wie ich daran gehen würde:
Java:
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ZeichenTest extends JPanel{
	

	private static final long serialVersionUID = 1L;
	private int xTile, yTile, renderCountX, renderCountY, colorCount; 
	private Color[] skipColor = {Color.RED, Color.YELLOW, Color.BLACK};

	public ZeichenTest(int xTile, int yTile){
		this.xTile = xTile;
		this.yTile = yTile;
		
	}
	
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		g.setColor(skipColor[colorCount]);
		g.fillRect((renderCountX*this.getWidth()/xTile), (renderCountY*this.getHeight()/yTile), this.getWidth()/xTile, this.getHeight()/yTile);
	}
	
	public void nextRenderStep(){
		if(renderCountX<xTile-1){
			repaint();
			renderCountX++;
		}else if(renderCountX == xTile-1){
			renderCountX = 0;
			renderCountY++;
			repaint();
		}if(renderCountY == yTile){
			renderCountY = 0;
			colorStep();
		}
	}
	
	private void colorStep(){
		if(colorCount<skipColor.length-1){
			colorCount++;
		}else{
			colorCount = 0;
		}
	}
	
	public static void main(String[] args) {
		
		JFrame fr = new JFrame("TestFrame");
		fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fr.setSize((int)(java.awt.Toolkit.getDefaultToolkit().getScreenSize().getWidth()*0.7), (int)(java.awt.Toolkit.getDefaultToolkit().getScreenSize().getHeight()*0.7));
		fr.setLocationRelativeTo(null);
		final ZeichenTest t1 = new ZeichenTest(5, 5);
		fr.add(t1);
		fr.setVisible(true);
		
		 new Thread(new Runnable() {
			
			@Override
			public void run() {
				while(true){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					t1.nextRenderStep();
				}
			}
		}).start();
	}

}

Gruß Vanny
 
V

vanny

Gast
nein natürlich nicht.
Dafür kannst du dann noch einen MouseListener/MouseMotionListener einbinden plus die nötige Logik.

Das erfüllt vorläufig nur repaint() und thread siehe Titel ^^
 

Marco13

Top Contributor
Es wäre wohl gut, zu wissen, wie das im "echten" Programm aussieht. Wenn du ein Mandelbrot berechnen willst, wirst du das ja kaum IN der paint-Methode machen. Dafür würde es sich anbieten, die ausgerechneten Daten in einem BufferedImage zu speichern (bi.setRGB(x,y,farbe))
 

rix

Mitglied
Bisher läuft die Berechnung in der paint()-Methode, doch. Weshalb ist das eine schlechte Idee? (Und was sollte ich stattdessen machen?)

BufferedImage klingt wie eine gangbare Lösung - ich werds mir ansehen. Wenn Du mir ein Beispiel (oder einen Link auf ein beliebiges Beispiel) geben, wie man das angeht?
 
V

vanny

Gast
Bisher läuft die Berechnung in der paint()-Methode, doch.

Weshalb ist das eine schlechte Idee? , die Antwort findest du in dem Zitat von dir ;)
das Zauberwort heisst "Bisher".
Wenn du lauter anderes Zeugs in die paint()-Methode packst, wird diese irgendwann nicht mehr zuverlässig arbeiten.

Zu dem BufferedImage, schon mal HIER nachgeschaut?

Gruß Vanny
 

rix

Mitglied
Ich hatte "bisher" geschrieben, weil impliziert wurde, dass das eine schlechte Idee ist. Das ist ja aber noch kein Grund.

Die einzige Möglichkeit, die Rechenlogik aus der paint()-Methode herauszunehmen, die ich sehe, ist in der Tat ein BufferedImage. Ich werds morgen probieren und mich noch mal melden, wenn ich auch damit mein Ziel nicht erreiche.

Danke auf jeden Fall (auch für den Such-Link; das war definitiv eine dumme Frage meinerseits :oops: )!
 

rix

Mitglied
Ich war mir ja noch nicht sicher, dass es wirklich daran lag. :p

Dieses spezielle Problem habe ich jedenfalls inzwischen gelöst; danke also für das Mithelfen.
 

Marco13

Top Contributor
Der Hauptgrund, warum das eine schlechte Idee ist, ist, das der Thread, der für das Zeichnen zuständig ist, damit durch die Mandelbrot-Berechnung bockiert wird - und wenn man z.B. die Fenstergröße ändert oder irgendeine Kleinigkeit macht, die ein reines Neuzeichnen auslösen würde (z.B. ein anderes Fenster kurz das Programmfenster verdeckt hat) das komplette Mandelbrot neu berechnet werden muss.
 

rix

Mitglied
Ah, ok. Mir war nicht bewusst, dass das immer ein Neuzeichnen nach sich zieht, danke! Inzwischen ist ja meine Rechenlogik auch vorgelagert, und in paint() wird nur noch das BufferedImage gezeichnet.

Danke noch mal!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
D JUNG Repaint function does not work AWT, Swing, JavaFX & SWT 2
E repaint Probleme AWT, Swing, JavaFX & SWT 13
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
G Repaint wird nicht durchgeführt AWT, Swing, JavaFX & SWT 8
I Swing Verhindern, dass repaint() kaskadiert AWT, Swing, JavaFX & SWT 6
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
N Swing JButtons werden nach repaint() doppelt dargestellt AWT, Swing, JavaFX & SWT 12
K Methode repaint() AWT, Swing, JavaFX & SWT 1
B Swing Wann brauche ich repaint() ? AWT, Swing, JavaFX & SWT 1
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
A repaint(); AWT, Swing, JavaFX & SWT 9
J Swing ungewünschter Nebeneffekt bei der repaint() Methode AWT, Swing, JavaFX & SWT 3
A Problem: repaint() - Schleife AWT, Swing, JavaFX & SWT 3
S 2D-Grafik repaint()-Aufruf. Und nichts geschieht. AWT, Swing, JavaFX & SWT 5
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
P JPanel und Repaint AWT, Swing, JavaFX & SWT 5
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
F JTable Repaint Issue AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
S JList repaint AWT, Swing, JavaFX & SWT 1
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D repaint() klappt anders als vorgestellt AWT, Swing, JavaFX & SWT 15
B Swing Repaint Problem - mal wieder AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Gezielter Repaint einzelner Frames in Java-Game AWT, Swing, JavaFX & SWT 6
javampir Bei repaint nix los AWT, Swing, JavaFX & SWT 2
B Swing repaint() AWT, Swing, JavaFX & SWT 3
Ernesto95 AnimationLoop - Problem bei Aufruf von repaint AWT, Swing, JavaFX & SWT 6
P 2D-Grafik repaint(); steigender RAM Verbauch AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
S Applet Repaint AWT, Swing, JavaFX & SWT 3
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
R Swing Grafikfehler bei repaint AWT, Swing, JavaFX & SWT 2
N repaint() blockieren AWT, Swing, JavaFX & SWT 6
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
M Repaint() AWT, Swing, JavaFX & SWT 14
J Swing repaint, repaint, repaint AWT, Swing, JavaFX & SWT 8
M Applet repaint() verlangsamen AWT, Swing, JavaFX & SWT 7
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
P EDT Problem? Kein Aufruf der repaint Methode AWT, Swing, JavaFX & SWT 6
V Applet JApplet Flackern durch Repaint AWT, Swing, JavaFX & SWT 11
kodela Problem mit repaint() AWT, Swing, JavaFX & SWT 3
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
F repaint reagiert nicht AWT, Swing, JavaFX & SWT 8
S AWT Probleme mit repaint() AWT, Swing, JavaFX & SWT 2
D Repaint()? Oder was??? AWT, Swing, JavaFX & SWT 5
M Eine nicht korrekte Darstellung bei repaint() warum? AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Kreis "von Hand" zeichnen -> jedesmal repaint()? AWT, Swing, JavaFX & SWT 6
R validate(), repaint funktionieren nicht! AWT, Swing, JavaFX & SWT 7
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
S validate(), invalidate(), repaint(),... Was kommt wann? AWT, Swing, JavaFX & SWT 5
M 2D-Grafik repaint() löscht altes Bild nicht AWT, Swing, JavaFX & SWT 2
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
R repaint erzwingen AWT, Swing, JavaFX & SWT 3
Zettelkasten repaint() von anderen Klassen aufrufen AWT, Swing, JavaFX & SWT 4
H repaint()-Problem - 50% CPU-Auslastung AWT, Swing, JavaFX & SWT 4
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
T repaint() Problem AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Repaint - Alternative? AWT, Swing, JavaFX & SWT 3
C JLabel, JTextArea, JScrollPane. repaint(); ? AWT, Swing, JavaFX & SWT 6
N Swing repaint() funktioniert nicht AWT, Swing, JavaFX & SWT 5
T Swing repaint funktioniert nur manchmal? AWT, Swing, JavaFX & SWT 6
K Jpanel repaint problem (Fullscreen) AWT, Swing, JavaFX & SWT 5
V Swing Bei repaint() tut sich nichts AWT, Swing, JavaFX & SWT 7
G ColorReader, bei Fadenkreuz zeichnen mit repaint() flackern AWT, Swing, JavaFX & SWT 19
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
D Swing Actionlistener verhindert repaint?! AWT, Swing, JavaFX & SWT 2
S JLabel repaint AWT, Swing, JavaFX & SWT 8
C Swing Linux mag mein Swing-repaint() nicht... AWT, Swing, JavaFX & SWT 7
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
Luk10 repaint() auch in anderen Klassen! AWT, Swing, JavaFX & SWT 6
A repaint() zu langsam, bitte um alternativen AWT, Swing, JavaFX & SWT 5
T Überlappende Transparenz und repaint() AWT, Swing, JavaFX & SWT 10
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
O Girdbag Formatierung nach repaint verloren AWT, Swing, JavaFX & SWT 2
E Swing - repaint() AWT, Swing, JavaFX & SWT 6
T Image wird nicht angezeigt?! - MediaTracker/repaint AWT, Swing, JavaFX & SWT 9
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
O Exception bei repaint AWT, Swing, JavaFX & SWT 3
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
Dit_ Zeilenmarkierung verschwindet nach repaint() AWT, Swing, JavaFX & SWT 12
A Swing Infinite repaint loop unterbrechen AWT, Swing, JavaFX & SWT 7
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
F "Verrutschen" von Komponenten bei repaint() AWT, Swing, JavaFX & SWT 9
Junker Fensterinhalt vor ausführen von repaint komplett löschen. AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
J Swing Verständnis-Problem repaint(int x,int y,int width,int height) AWT, Swing, JavaFX & SWT 3
C Frame repaint hat keine Wirkung AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben