AWT begrenzte anzahl paint aufrufe

kaetzacoatl

Bekanntes Mitglied
Hallo,
ich habe einen Thread, der repaint aufruft und
dann darauf wartet, das ein Canvas neu gezeichnet wird.
Code(gekürzt):
Java:
public class GameUpdater extends Thread implements KeyListener, MouseListener, MouseMotionListener {

	private static final long MINTIME = 20;
	private Game game;
	public ArrayList<GameObject> objs;
	private ArrayList<KeyEvent> keys;
//weitere felder

	public GameUpdater(Game game) {
		super("GameUpdater");
		this.game = game;
		objs = new ArrayList<GameObject>();
		keys = new ArrayList<KeyEvent>();
	}

//info-methoden

	@Override
	public void run(){
		long time;
		while(true){
			time = System.currentTimeMillis();			
			for(int i = 0;i < objs.size();i++){
				objs.get(i).update(this);
			}
			game.points.clear();
			for(int i = 0;i < objs.size();i++){
				game.points.addAll(objs.get(i).img);
			}
			game.repaint();
			waitForRepaint();
			System.out.println(time + " / " + (System.currentTimeMillis() - time));
			while(time + MINTIME > System.currentTimeMillis());
		}
	}

	private void waitForRepaint() {
		synchronized(game){
			try {
				game.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
//interface-methoden

}
public class Game extends Canvas {

	private static final long serialVersionUID = 5734742867859616972L;
	
	Vector<ColorPoint> points = new Vector<ColorPoint>();
	
	public Game(){
		super();
		GameUpdater gu = new GameUpdater(this);
		this.addKeyListener(gu);
		this.addMouseListener(gu);
		this.addMouseMotionListener(gu);
		gu.start();
	}
	
	@Override
	public void paint(Graphics g){
		for(int i = 0;i < points.size();i++){
			ColorPoint cp = points.get(i);
			drawPoint(g,cp.getColor(),cp.x,cp.y);
		}
		synchronized(this){
			notify();
		}
	}
	
	private void drawPoint(Graphics g, Color c, int x, int y){
		g.setColor(c);
		g.drawRect(x, y, 1, 1);
	}

}

Nach einiger Zeit gibt es allerdings keine Ausgabe
mehr und der Thread wartet auf ein notify().
1.Warum?
2.Was kann ich dagegen tun?
 
Zuletzt bearbeitet:

Network

Top Contributor
Du wartest darauf bis fertig gezeichnet wurde? Warum? Es gibt überhaupt keinen Grund das zu tun. Das zeichnen beeinflusst in keiner Weise die Logik des Programmes normalerweise, und wenn sie das macht, dann hat man ein falsches System aufgestellt.
Während die Logik weiterhin ausgeführt wird, kann neugezeichnet werden, deine Methode verlangsamt nur das Programm.(?)

Gruß
Net
 

kaetzacoatl

Bekanntes Mitglied
Ich hab jetzt was gefunden:
Java:
@Override
	public void run(){
		long time;
		while(true){
			time = System.currentTimeMillis();			
			for(int i = 0;i < objs.size();i++){
				objs.get(i).update(this);
			}
			//game.points.clear();
			for(int i = 0;i < objs.size();i++){
				game.points.addAll(objs.get(i).img);
			}
			game.points.add(null);
			game.repaint();
			//waitForRepaint();
			System.out.println(time + " / " + (System.currentTimeMillis() - time));
			while(time + MINTIME > System.currentTimeMillis());
		}
//und
@Override
	public void paint(Graphics g){
		ColorPoint cp;
		while(!points.isEmpty() && (cp = points.remove(0)) != null){
			drawPoint(g,cp.getColor(),cp.x,cp.y);
		}
//		for(int i = 0;i < points.size();i++){
//			ColorPoint cp = points.get(i);
//			drawPoint(g,cp.getColor(),cp.x,cp.y);
//		}
//		synchronized(this){
//			notify();
//		}
	}

Ich befürchte jetzt aber,
dass Game nichtmehr mit dem
zeichnen nachkommt, daher strebe
ich immernoch eine Lösung für
mein altes Problem an.
[EDIT]
Meine Befürchtung war berechtigt,
der Vector quillt über!
[/EDIT]
 
Zuletzt bearbeitet:

Network

Top Contributor
Wie wäre es wenn du eine boolean-Variable einsetzt, die vor dem Aufruf repaint() auf false gesetzt wird und sobald die paint-MEthode das Ende erreicht hat setzt sie die Variable auf true.
Währenddessen wird in der Run-Methode alle paar Millisekunden abgefragt ob bereits die Variable bereits true ist.
Java:
while( !continue ) Thread.wait( 10 );

Offensichtlich geht es bei dir darum eine Liste mit Punkten zu zeichnen. Wie wäre es wenn du bei jedem durchlauf einen neuen Vector erstellst als den alten weiterhin zu verwenden?
Du verwendest eine Variable für den Vector wie du es jetzt machst, kurz vor dem zeichnen passiert aber das:
Java:
zuZeichnen = points;
points = new Vector()<ColorPoint>;
repaint();

Gruß
Net
 

kaetzacoatl

Bekanntes Mitglied
Ich hab die Änderungen vom
letzten Post wieder zurückgenommen
und jetzt funktioniert alles wunderbar.
Warum:???:L
Aber trotzdem Danke für die Vorscläge.
Ich probier sie mal aus und teste obs
besser geht.
 

Marco13

Top Contributor
Statt da irgendwas per Hand zu kopieren und/oder umzuschalten kann man auch
List<Think> things = new CopyOnWriteArrayList<Thing>();
verwenden, allerdings sollte man sich im Klaren sein, dass es bei "vielen" Objekten ineffizient sein kann, wenn immer kopiert wird. (Eine einfache Lösung gibt es aber nur in Fällen, die so einfach sind, dass einen die Lösung da auch nicht mehr interessiert :D)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H automatische Anzahl der Spalten ermitteln -> geht nicht AWT, Swing, JavaFX & SWT 6
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
H TableView mit variabler Anzahl Spalten AWT, Swing, JavaFX & SWT 2
D Swing JSlider Tip Anzahl AWT, Swing, JavaFX & SWT 3
Hijo2006 Anzahl der Excelzeilen AWT, Swing, JavaFX & SWT 1
L Swing Variable Anzahl an JButtons AWT, Swing, JavaFX & SWT 7
Kandum obj_JMenu.addMenuListener - variable Anzahl an JMenus / menulistenern & frame.setTitle() dynamisch AWT, Swing, JavaFX & SWT 7
K SWT DataBinding, Anzahl der Zeilen aktualisieren AWT, Swing, JavaFX & SWT 4
M Anzahl Frames in Taskleiste AWT, Swing, JavaFX & SWT 2
R Swing unbegrenzte Anzahl vonEinträgen in JList AWT, Swing, JavaFX & SWT 2
DEvent Swing JTextField Anzahl an sichtbaren Zeichen AWT, Swing, JavaFX & SWT 4
Y JTable mit großer Anzahl von Datensätzen AWT, Swing, JavaFX & SWT 3
G Swing JTextArea mit fester Anzahl Spalten! AWT, Swing, JavaFX & SWT 10
T Anzahl Event Listeners AWT, Swing, JavaFX & SWT 4
O Anzahl der Zeilen im TableViewer AWT, Swing, JavaFX & SWT 12
G JList mit einer großen Anzahl an Einträgen AWT, Swing, JavaFX & SWT 15
Airwolf89 Swing Anzahl der Tabellenspalten dynamisch setzen AWT, Swing, JavaFX & SWT 2
T entsprechende Anzahl an jCheckboxen in einer jTable AWT, Swing, JavaFX & SWT 5
M Problem mit Festsetzen der Anzahl ein reihen in einer JTable AWT, Swing, JavaFX & SWT 11
M Komponenten einer unbestimmten Anzahl und MouseListener AWT, Swing, JavaFX & SWT 4
J jTextarea Anzahl Zeichen in einer Zeile begrenzen AWT, Swing, JavaFX & SWT 2
S JList gibt nach Sortierung mit Collections keine Anzahl mehr AWT, Swing, JavaFX & SWT 3
B random anzahl an jTextFieldern einfügen AWT, Swing, JavaFX & SWT 2
J Große Anzahl von Comboboxen in Tabelle darstellen AWT, Swing, JavaFX & SWT 2
G Tabelle mit variabler Anzahl an Zeilen AWT, Swing, JavaFX & SWT 3
M JList mit unbestimmter Anzahl Panels füllen AWT, Swing, JavaFX & SWT 4
X JTable --> Anzahl der Spalten ändern AWT, Swing, JavaFX & SWT 8
S Anzahl ActionEvents (Strings in eine ArrayList einfügen) AWT, Swing, JavaFX & SWT 4
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
U Was ist der Unterschied von paint und paincomponent? AWT, Swing, JavaFX & SWT 3
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
L Berechnungen in paint AWT, Swing, JavaFX & SWT 8
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
S 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
C JFrame paint ohne hintergrund nutzen AWT, Swing, JavaFX & SWT 6
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
S paint() verzögern AWT, Swing, JavaFX & SWT 9
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
L AWT paint mit ArrayList und Iterator AWT, Swing, JavaFX & SWT 3
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
T JFrame und paint() AWT, Swing, JavaFX & SWT 5
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Hostkomponentengröße in paint AWT, Swing, JavaFX & SWT 2
L JFrame an Paint-Inhalt anpassen AWT, Swing, JavaFX & SWT 6
E Warum übermalt paint das ganze Fenster? AWT, Swing, JavaFX & SWT 15
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
T paint() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 8
M JMenuBar im Applet und paint AWT, Swing, JavaFX & SWT 9
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
H paint überlappend AWT, Swing, JavaFX & SWT 5
E paint AWT, Swing, JavaFX & SWT 3
H Swing paint() von JPanel wird nicht aufgerufen AWT, Swing, JavaFX & SWT 10
L AWT Paint(g) im Listener aufrufen AWT, Swing, JavaFX & SWT 2
S JCheckBox Paint AWT, Swing, JavaFX & SWT 7
F AWT Probleme mit der paint() methode AWT, Swing, JavaFX & SWT 2
C Unterschiedlicher Aufruf der paint() Methode ? (AWT/Swing) AWT, Swing, JavaFX & SWT 2
L Problem mit paint Methode und Bild AWT, Swing, JavaFX & SWT 7
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
K AWT paint wird nicht aufgerufen AWT, Swing, JavaFX & SWT 7
R LayoutManager Image Paint + Text Panel AWT, Swing, JavaFX & SWT 10
F paint-Methode des JComboboxEditorComponent AWT, Swing, JavaFX & SWT 2
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
radiac Swing JFrame - paint(g) - FrameObjects bei activeRendering AWT, Swing, JavaFX & SWT 3
I AWT paint() in MouseEvent aufrufen klappt nicht AWT, Swing, JavaFX & SWT 8
T paint() wird zweimal ausgeführt AWT, Swing, JavaFX & SWT 6
hdi Swing JLabel & paint-Methode gemixt - wie schlimm wirklich? AWT, Swing, JavaFX & SWT 5
N Paint methode anhalten und neustarten AWT, Swing, JavaFX & SWT 5
H AWT Wann ist paint() fertig? AWT, Swing, JavaFX & SWT 7
R [gelöst]Fenster schließen - trotz Endlosschleife in der Paint-Methode? AWT, Swing, JavaFX & SWT 3
W Steuerelemente und paint() in einem JPanel AWT, Swing, JavaFX & SWT 3
M Allgemeines zur paint Methode AWT, Swing, JavaFX & SWT 5
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
G Probleme mit repaint / paint AWT, Swing, JavaFX & SWT 6
A paint()-Methode für Videoexport nutzen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben