Probleme mit repaint()

epytir

Mitglied
Hallo Community,
ich habe mittlerweile seit Wochen Probleme mit repaint() ich habe schon X seiten gegoogelt und nichts hat geholfen.
Zu meinem Problem ich versuche mich an einer Anwendung die automatisch einen Graphen von Punkt zu Punkt verbindet also nicht alle auf einmal sondern als Animation....
Ich Speicher die Punkte die verbunden werden sollen in ein Point Array und daraus soll dann paintcomponent sich die Koordinaten für die Verbindung raussuchen das sieht dann so aus :
Java:
			 for(int i = 0;i<towns.getPointsDrawable() ; i++)
			 {
					 x1 = (int)towns.getLinesPosition(i, 0).getX();
					 y1 = (int)towns.getLinesPosition(i,0).getY();
					 x2 = (int)towns.getLinesPosition(i,1).getX();
					 y2 = (int)towns.getLinesPosition(i,1).getY();	 
					 g.drawLine(x1, y1, x2, y2);
			 }
getPointsDrawable steht für wie weit er im Array gehen kann also wieviele Punkte im Array gespeichert sind damit es keine Zugriffsfehler gibt.
Leider passiert rein garnichts wenn ich repaint() aufrufe nachdem ich einen Punkte hinzugefügt habe. Wenn er fertig ist und alle Punkte im Koordinatensystem verbunden sind gibt er den gesammten Graphen korrekt aus aber ich will ja das er das Stück für Stück macht ;( ;(
Habe es schon mit einem Thread versucht der jede halbe Sekunde repaint aufruft seiner ohne Erfolg...
Ich habe alles zum Zeichnen in der paintComponent Methode und rufe am Anfang immer super.paintComponent auf damit meine Buttons nicht verschwinden.(Nur als Info :) )
Achso und ich habe mal ein System.out in der paintcomponent gemacht es ist so das diese erst am Ende aufgerufen wird und dann gleich so oft wie es Wege gibt also wenn ich 5 Wege zeichne dann führt er am Ende 5 mal direkt hintereinander paintComponent aus anstatt das in gewissen abständen zu tun.
Meine Init und run Methoden sehen so aus :
Java:
public void init() 
{ 
     clockThread= new Thread(this); 
     clockThread.start(); 
}


public void run() 
{ 

	System.out.println("TEdt");
     while (true) 
     { 
    	repaint();
          try 
          { 
               clockThread.sleep(500); 
          } 
          catch (InterruptedException e) 
          { 
               System.out.println(e); 
           } 

     } 
}
Und das ganze ist ausgelagert also meine Main ist in einer anderen Klasse die PaintKlasse wird als Jpanel in der Main benutzt der Kopf der paint Klasse ist :
Java:
public class PaintPanel extends JPanel implements Runnable{
Hoffe jemand kann mit helfen bin am verzweifeln
Gruß Epytir
 
Zuletzt bearbeitet von einem Moderator:

Tucan

Bekanntes Mitglied
Übershreib mal die update() Methode. Und zwar so:

[Java] public void update(Graphics g) {
paint(g);

}
[/Java]
 
Zuletzt bearbeitet:

epytir

Mitglied
Danke schon mal für die Antwort hat leider nichts gebracht ich habe mal getestet das Programm ruft alle 500 Millisekunden repaint auf. Sobald ich das zeichnen starte wartet er bis alles gezeichnet ist und repainted erst dann... sehr doof.

Ich habe in meiner Methode zum zeichnen einen Sleep Thread eingebaut da sonnst der Computer in milisekunden alle Punkte ausgeben würde und genau bei diesem Sleep schläft auch der repaint ein kann ich das irgendwie verhindern ?
 

Garog0201

Mitglied
Ist ja lustig :) Genau die gleiche Anwendung habe ich vor ein paar Tagen programmiert.
Beim mir läuft es, allerdings bin ich mit der Umsetzung nicht zufrieden und möchte es optimieren.

Aber hier mal mein zusammengeschnittener Code, mit dem ich eine wunderbare Kurve zeichne.

Java:
package fuerforum;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import static javax.swing.JFrame.EXIT_ON_CLOSE;

public class Main extends JComponent implements Runnable {

	static int wert;
	Integer[] aktuell;

	public Main() {

		aktuell = new Integer[900];
		for (int i = 0; i < 900; i++) {
			aktuell[i] = 0;
		}
	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(1024, 600);
		Main system = new Main();
		frame.setContentPane(system);
		new Thread(system).start();
		frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
		frame.setVisible(true);

		JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 100, 15);
		slider.setBounds(450, 450, 200, 200);
		slider.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				wert = ((JSlider) e.getSource()).getValue();
			}
		});
		frame.add(slider);

	}

	@Override
	public void run() {
		while (true) {

			long t = System.currentTimeMillis();

			for (int i = 0; i < 900; i++) {
				if (i > 0)
					aktuell[i - 1] = aktuell[i];
			}
			aktuell[899] = 360 - wert;

			this.validate();
			this.repaint();

			long d = t - System.currentTimeMillis();
			int wait = 10 - (int) d;
			if (wait > 0)
				try {
					Thread.sleep(wait);
				} catch (InterruptedException e) {
				}

		}
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(Color.white);
		g.fillRect(46, 40, 904, 360);
		g.setColor(Color.black);
		for (int i = 1; i < 900; i++) {
			g.drawLine(i + 46, aktuell[i - 1] + 40, i + 46, aktuell[i] + 40);
		}
	}
}

Möge es dir helfen :)
 

epytir

Mitglied
Leider hat diese Lösung bei mir nicht funktioniert ...
Ich habe eine Klasse für das Panel und die Main in einer anderen Klasse das sollte zwar eigentlich trotzdem gehen aber geht irgendwie nicht ....
Achso und mein Graph entsteht durch eine rekursive Methode also ein Array das jede Sekunde einen neuen Punkt dazu bekommt und das soll eigentlich gezeichnet werden leider bisher ohne Erfolg.
Danke aber schonmal für den Versuch habe verschiedene Abwandlungen deines Codes versucht leider ohne Erfolg.
Gruß Epytir
 

Garog0201

Mitglied
Rufst du das zeichnen der Punkte den auch in der while Schleife auf ? den sonst werden die 5 ja alle gezeichnet und du machst halt nur alle 500 ms ein repaint, was dir ja auch nichts bringt dann.
du müsstest ja vor dem repaint in der while schleife punkt für punkt dazu bringen, also pro while durchlauf einen punkt mehr. das was du gepostet hast sieht mir aktuell nicht so aus
 

epytir

Mitglied
Ich hatte das so gelöst das es eine Methode getPointsDrawable gibt in dieser steht wie viele Punkte gezeichnet werden können mit jedem Schleifendurchlauf wird diese um eins erhöht und in der Schleife wird ein repaint aufgerufen bzw hatte auch mal eine Pause von 1 Sek in der Schleife. Leider wird trotzdem erst am Ende der Schleife gezeichnet.

Die Pause die ich hatte hat leider das gesamte Programm angehalten gibt es eine Funktion die nur die Methode anhällt damit repaint in ruhe zeichnen kann ?
In meiner Schleife wird immer am Ende die Methode
Code:
MainWindowGui.Dorepaint();[\Code]
Diese ist so implementiert :
[Code]	
	public static void Dorepaint() {	
		panel_drawArea.validate();
		panel_drawArea.repaint();
	}
	[\Code]
leider funktioniert das nicht .. :(
 

Garog0201

Mitglied
Du zeichnest mit deiner For Schleife auch erst alle Punkte und machst dann ein repaint oder ?
eigentlich müsstest du das repaint ja mit in die schleife nehmen.

das mit dem stoppen des programms kannst du über Threads bzw Timer verhindern.

z.B. so
Java:
        TimerTask task = new TimerTask()
        {
            @Override
            public void run()
            {
                system.repaint();
            }
        };
        Timer timer = new Timer();
        timer.schedule(task, 0, 10);
startet den Timer sofort und wiederholt alle 10ms das was im run() steht.
Könnte bei dir jetzt auch das erstellen der ersten 5 punkte + repaint sein.
system ist die das Objekt (Klasse mit extends JComponent in meinen Fall) was du neu zeichnen willst.
In system muss dann auch das
Java:
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
usw.. drin stehen.

aber probiere vielleicht erst mal dein repaint in der for schleife aus und nehm in die for schleife ein
Java:
try { Thread.sleep(100); } catch (InterruptedException e) {  }
mit rein, nur um zu testen ob er dann alle 100ms einen punkt dazu zeichnet
 
Zuletzt bearbeitet:

epytir

Mitglied
Die Pause hat leider auch nichts genutzt er macht zwar Pause rapainted aber vorher nicht .
Habe jetzt extra die draw Area global gemacht um direkt repaint anzusprechen leider auch ohne Erfolg.
Er führt repaint in der Schleife nicht aus erst wenn alle Punkte fertig sind führt er repaint aus. Habe das mit Sys outs getestet er kommt zwar immer in die Schleife aber ignoriert das repaint am ende. In meiner paintComponent Methode ist auch ein Sys.out und das gibt immer nur am Ende der Schleife einmal aus anstatt mit jedem Durchgang.
Java:
MainWindowGui.panel_drawArea.repaint();
try { Thread.sleep(100); } catch (InterruptedException e) {  }

Das komische ist das sogar der Timer während der Schleife stehen geblieben ist auch hier kein Sys.out mehr erst nach der Schleife :(
Da der Code der Schleife nicht mir gehört darf ich ihn nicht posten aber das sind nur 2 for Schleifen und ein return nichts das so ein Verhalten erklären würde :(
Wenn paintComponent überhaupt mal in der Schleife ausgeführt werden würde denk ich das dass alle Probleme löst ...
Danke schonmal für die bisherige Hilfe ist echt super :)
 

Joose

Top Contributor
Du legst den Thread schlafen der "repaint"en soll daher wird auch nichts neu gezeichnet! ;)
Der Code in "repaint" wird zwar ausgeführt aber durch dein Sleep danach wird der eigentliche "Zeichner" blockiert.
 

arilou

Bekanntes Mitglied
Kapsel' doch die "Rekursionsmethode" in einen eigenen Thread.
Generell sollte man Datenmodell, (Geschäfts-)logik und Anzeige möglichst weitgehend getrennt halten.
 

epytir

Mitglied
Letztlich ahbe ich eine nicht ganz so elegante Lösung gefunden, aber da es mir nicht auf Performance ankommt ist das ok :D

Hier mal meine Lösung falls es irgendwann mal jemand braucht

Java:
paintpanel.paint(paintpanel.getGraphics());
try{Thread.sleep(100);} catch InterruptedException e{}

Es aktualisiert das Gesammte Frame, da ich auf diesem Frame nur zeichne und auf einem anderen Frame meine Buttons sind und vereinzelt auch Wege verschwinden ist diese Lösung sehr gut für mich, da alle nicht mehr aktuellen Wege verschwinden. Man sollte auf jedenfall eine Zeit einbauen sonnst flackert das Frame in einer zu schnellen Schleife.
Gruß Epytir
 
Zuletzt bearbeitet:

Foxei

Bekanntes Mitglied
Ich kenne natürlich nicht genau dein Programm aber ich zeichne mit dem Swing Timer da gibt es kein Flackern oder einfrierende Fenster.
Hier mal eine kleines Programm das nichts macht außer einen Graphen zu zeichenen von Links nach Rechts ohne Flackern Ruckeln oder dergleichen.


Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.border.EmptyBorder;


public class Graphen extends JFrame {

	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Graphen frame = new Graphen();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	private List<Point> points=new ArrayList<Point>();
	private Timer timer;
	private int x=0;
	/**
	 * Create the frame.
	 */
	public Graphen() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 700, 400);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		GraphLabel graphLabel=new GraphLabel();
		add(graphLabel,BorderLayout.CENTER);
		
		JButton btn=new JButton("Start");
		add(btn, BorderLayout.SOUTH);
		btn.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				x=0;
				timer.start();
			}
		});
		
		timer=new Timer(10, new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				
				x++;
				repaint();
				if(x==500)
				timer.stop();
			}
		});
		
		points.add(new Point(0,0));
		points.add(new Point(100,100));
		points.add(new Point(200,120));
		points.add(new Point(300,300));
		points.add(new Point(400,310));
	}
	public class GraphLabel extends JLabel{
		
		@Override
		protected void paintComponent(Graphics g) {
			Graphics2D g2d=(Graphics2D) g;
			g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
			for(int i=0;i<points.size()-1;i++){
				g2d.drawLine(points.get(i).x, points.get(i).y, points.get(i+1).x, points.get(i+1).y);
			}
			g2d.setColor(getBackground());
			g2d.fillRect(x, 0	, getWidth(), getHeight());
		}
	}

}
 

Foxei

Bekanntes Mitglied
Wahlweise kann zu Glättung des Graphen noch das Antialiasing eingeschaltet werden.
Java:
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Probleme mit der repaint-Funktion Java Basics - Anfänger-Themen 6
H Variablen Probleme mit repaint() Java Basics - Anfänger-Themen 2
R Probleme beim Repaint Java Basics - Anfänger-Themen 3
kulturfenster Probleme mit repaint() Java Basics - Anfänger-Themen 2
J probleme mit repaint Java Basics - Anfänger-Themen 2
D Probleme bei Verwendung short und int im Constuctor Java Basics - Anfänger-Themen 6
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
P Probleme mit NetBeans: Wie lässt sich jar. Datei an einem MacBook öffnen Java Basics - Anfänger-Themen 21
I Projekte in IDE untereinander sharen / Probleme beim Build Java Basics - Anfänger-Themen 8
MiMa Probleme mit Datentyp long ?? Java Basics - Anfänger-Themen 2
T Probleme beim Import eines Git-Repos Java Basics - Anfänger-Themen 2
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
B Quiz mit RMI Probleme mit RMI start Java Basics - Anfänger-Themen 4
httprt Probleme bei dem erstellen von leveln in meinem Spiel Java Basics - Anfänger-Themen 2
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
V Probleme Guessing Game Java Basics - Anfänger-Themen 8
hebein PDF Ausdruck auf Drucker - Probleme mit Format Java Basics - Anfänger-Themen 17
R JMenu/JMenuItem Probleme Java Basics - Anfänger-Themen 2
B Static vs non static und Probleme daraus Java Basics - Anfänger-Themen 13
J Probleme mit dem Debugger Java Basics - Anfänger-Themen 4
I Probleme mit OutputStream - Datei lässt sich nicht öffnen Java Basics - Anfänger-Themen 4
J Probleme mit Kompilierung Java Basics - Anfänger-Themen 11
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
W Objekte über Scanner Input; ToString Probleme... Java Basics - Anfänger-Themen 4
C Probleme mit paintComponent Java Basics - Anfänger-Themen 13
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
E JavaFX Editor Probleme mit der Zwischenablage Java Basics - Anfänger-Themen 12
C Probleme mit dem Erstellen und Importieren von Packages Java Basics - Anfänger-Themen 6
3 OOP erste Versuche, OOP zu verstehen. Probleme mit gettern und settern Java Basics - Anfänger-Themen 4
R Erste Schritte Probleme bei 2D Spielfeld, mit einzufügender "Person" Java Basics - Anfänger-Themen 5
P Probleme bei der Installation von JavaFX Java Basics - Anfänger-Themen 3
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
D Probleme mit JFrame und der Größe Java Basics - Anfänger-Themen 8
Dimax String Probleme Java Basics - Anfänger-Themen 12
N Probleme beim printen von Arrays durch for Schleife Java Basics - Anfänger-Themen 3
Splayfer Java Array Probleme Java Basics - Anfänger-Themen 3
J Probleme bei IllegalArgumentException "werfen". Java Basics - Anfänger-Themen 1
K Probleme bei der Ausgabe - komme nicht weiter :/ Java Basics - Anfänger-Themen 15
X Probleme im Umgang mit PriorityQueue Java Basics - Anfänger-Themen 75
D Probleme mit dem Windowbuilder und JComboBox Java Basics - Anfänger-Themen 2
M Regex Probleme (mal wieder) Java Basics - Anfänger-Themen 3
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
J Probleme mit Vererbung Java Basics - Anfänger-Themen 4
X Probleme mit Übungsaufgaben zu Zahlentypen Java Basics - Anfänger-Themen 4
G Probleme bei Aufgabe Java Basics - Anfänger-Themen 12
P Erste Schritte Probleme mit dem Programmieren Java Basics - Anfänger-Themen 12
B Probleme bei einer Aufgabe Java Basics - Anfänger-Themen 19
Franzi1001 Probleme mit Eclipse Java Basics - Anfänger-Themen 7
T Probleme bei Installation von JDK Java Basics - Anfänger-Themen 2
C Probleme mit String-Vergleich Java Basics - Anfänger-Themen 4
C Probleme bei Regex Java Basics - Anfänger-Themen 9
V Probleme mit Arrays Java Basics - Anfänger-Themen 8
D Kleine Probleme mit Split-Befehlen Java Basics - Anfänger-Themen 5
T Probleme mit Strings Java Basics - Anfänger-Themen 6
G Probleme bei Frame aufgaben Java Basics - Anfänger-Themen 6
N Probleme mit dem ActionListener Java Basics - Anfänger-Themen 4
D Probleme beim Kompelieren mache ich etwas falsch ? Java Basics - Anfänger-Themen 3
L Probleme mit Java Java Basics - Anfänger-Themen 3
S Probleme mit abspielen einer .wav Datei Java Basics - Anfänger-Themen 2
J Probleme bei der Umwandlung einer Farbe von Hex zu RGB Java Basics - Anfänger-Themen 8
K Probleme beim Programm schreiben - Lesen von Dateiinhalten -zaehlen von Wörtern/ Buchstaben Java Basics - Anfänger-Themen 4
M Probleme beim aktualisieren eines JPanels Java Basics - Anfänger-Themen 7
J Probleme beim Array ausgeben Java Basics - Anfänger-Themen 4
M Probleme bei rekursiver Zuordnung Java Basics - Anfänger-Themen 1
I Probleme mit 2 dimensionale Arrays Java Basics - Anfänger-Themen 3
H Best Practice View probleme Java Basics - Anfänger-Themen 2
B Probleme mit Kreisberechnung Java Basics - Anfänger-Themen 15
E Probleme mit Scanner Java Basics - Anfänger-Themen 4
J Eclipse Export Probleme Java Basics - Anfänger-Themen 25
M Probleme beim verwenden von Packages Java Basics - Anfänger-Themen 6
D Probleme mit der Übergabe einer BorderPane Java Basics - Anfänger-Themen 2
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
BlueFox Tabelle in der Konsole ausgeben - Probleme Java Basics - Anfänger-Themen 1
G Methoden Probleme beim Methodenaufruf Java Basics - Anfänger-Themen 2
V Klassen ObjectInputStream ->ReadObject Probleme Java Basics - Anfänger-Themen 5
P Probleme mit der Do-Schleife Java Basics - Anfänger-Themen 2
F Erste Schritte Compiling Probleme Java Basics - Anfänger-Themen 13
S Neuling und Probleme bei Schulaufgabe Java Basics - Anfänger-Themen 5
J Anfänger: ActionListener und ProcessBuilder machen Probleme Java Basics - Anfänger-Themen 6
S Erste Schritte 2D Grafik Probleme mit KeyListener. Java Basics - Anfänger-Themen 18
M Array mit eigenem Datentyp probleme beim übergeben Java Basics - Anfänger-Themen 6
M Probleme mit Eclipse Java Basics - Anfänger-Themen 20
G Probleme beim casten von double zu int Java Basics - Anfänger-Themen 3
E 2 Probleme - Datum & private finale Variablen Java Basics - Anfänger-Themen 5
S Compiler-Fehler javac hat Probleme mit Paketen unter OSX Java Basics - Anfänger-Themen 2
J Probleme beim schreiben von Dateien Java Basics - Anfänger-Themen 5
B Variablen Probleme mit Eclipse Java Basics - Anfänger-Themen 6
H Mouse- und KeyListener Probleme? Java Basics - Anfänger-Themen 5
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
I Probleme bei Verzeichnissanalyse Java Basics - Anfänger-Themen 12
F Probleme mit privaten Klassen (abstrakten Klassen) Java Basics - Anfänger-Themen 1
H Probleme mit Klassen...oder: Eine Uhr Java Basics - Anfänger-Themen 9
G Probleme mit Konsole Java Basics - Anfänger-Themen 4
S Probleme mit GamGrid Spiel-Erstellung => Actor reagiert nicht auf Tastatur Java Basics - Anfänger-Themen 2
G Probleme mit Eclipse oder der URL Klasse Java Basics - Anfänger-Themen 5
W Verständnis Probleme bei der while-Schleife und continue Java Basics - Anfänger-Themen 21
M Probleme mit Anzeigen von String in GUI und if-Anweisung Java Basics - Anfänger-Themen 9
T Konstruktor Probleme Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben