AWT paint mit ArrayList und Iterator

Ludwitch

Neues Mitglied
Hallo,

ich arbeite derzeit an einem kleinen Programm und habe ein Problem mit folgendem Teil.

Java:
public class GUI extends Frame implements ActionListener{
private ArrayList<String> text;

//Constructor
GUI(){
	this.addWindowListener(new WindowClosingAdapter(true));
	this.setSize(900,500);
	this.setVisible(true);
}
public void addString(String s){
	text.add(s);
}
public void paint(Graphics g){
	String s;
	int d = 0;
	for(Iterator<String> i = text.iterator(); i.hasNext();){
		d++;
		s = i.next();
		g.drawString(
			s, 
			getInsets().left + 50,    
			getInsets().top  + 100 + d*20
		);
	}
}
}

Die ArrayList text ist anfangs leer und wird nach und nach mit Werten gefüllt. Die paint-Methode sorgt dafür, dass immer alle Elemente der ArrayList dargestellt werden.
Wenn allerdings paint gerade mit der Darstellung beschäftigt ist und der Iterator hochzählt und gleichzeitig mit addString die ArrayList erweitert wird, dann kommt es zu dem Fehler java.util.ConcurrentModificationException.
Das ist wohl von Java so gewünscht, ist in meinem Fall aber ziemlich lästig.

Die Alternative, die ich mir überlegt habe, ist ziemlich umständlich und unelegant:
Ich könnte statt einer ArrayList ein statisches Array verwenden. Die Dimension vorzugeben wäre kein Problem, allerdings müsste ich beim Hinzufügen jedesmal die erste ffreie Stelle des Arrays ermitteln, an die der neue Wert geschrieben werden soll. Und wenn ich das Array in einer Schleife durchlaufe, muss ich für jede Array-Position prüfen, ob die Position belegt ist oder null enthält.

Meine Frage ist nun, ob es andere, elegantere Möglichkeiten gibt, mein Ziel zu erreichen. Kann man das Programm dazu bringen, den oben erwähnten ArrayList-Fehler ignorieren? Oder gibt es eine grundsätzlich andere Vorgehensweise, die geeignet ist?

Viele Grüße
Christian
 
Meine Frage ist nun, ob es andere, elegantere Möglichkeiten gibt, mein Ziel zu erreichen. Kann man das Programm dazu bringen, den oben erwähnten ArrayList-Fehler ignorieren? Oder gibt es eine grundsätzlich andere Vorgehensweise, die geeignet ist?
Evtl. würde es schon reichen ohne Iterator über die ArrayList zu iterieren.
Ansonsten müsste man versuchen den Zugriff auf die List zu synchronisieren -allerdings ohne die paint dabei zu blockieren.
#####EDIT
Wie wird eigentlich das repaint() getriggert?
 
die Standardlösung der Synchronisation ist verbunden mit Stichwörtern wie SwingWortker oder SwingUtilities.invokeLater(),
dazu kannst du ne Menge nachlesen,

---

statt
Java:
    String s;
    for(Iterator<String> i = text.iterator(); i.hasNext();){
        s = i.next();
geht übrigens kürzer
Java:
    for(String s : text){
 
An eine Art Synchronisation habe ich auch schon gedacht, hab dazu aber einfach zu wenig Ahnung.

Das repaint wird durch eine Änderung der ArrayList getriggert (denke ich). Manuell rufe ich es jedenfalls nicht auf.

Auf die Idee mit einem einfachen Index durch die ArrayList zu gehen bin ich gar nicht gekommen. *vom Schlauch runtersteig* Damit sollte das Problem sehr einfach behoben sein. Danke.
 

Neue Themen


Zurück
Oben