JList blendet teilweise Inhalt aus

Status
Nicht offen für weitere Antworten.

Sanix

Top Contributor
In meinem Programm gibt es eine JList,welche Logmeldungen enthält. Unter Linux wird teilweise der gesamte Inhalt nicht angezeigt und später, wenn neue Meldungen dazu kommen, wieder angezeigt. Dieses Verhalten hatte ich unter Windows erst einmal.

[highlight=Java]
//Statuslist
JList jl = new JList(statusList);
jl.setCellRenderer(new StatusListRenderer());


public void addStatus(String message, Color color)
{
//Msg object
StatusMessage msg = new StatusMessage();
msg.setMessage(Calendar.getInstance().getTime() + " " + message);
msg.setColor(color);
//Add data to the list
statusList.add(0, msg);
System.out.println(message);
}
[/highlight]

[highlight=Java]
public class StatusListRenderer extends DefaultListCellRenderer implements ListCellRenderer
{
private static final long serialVersionUID = -2426469711174637700L;

@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus)
{

super.getListCellRendererComponent(list, value, index, isSelected,
cellHasFocus);

//Message object
StatusMessage msg = (StatusMessage) value;
setForeground(msg.getColor());
setText(msg.getMessage());


return this;
}
}
[/highlight]
 
Ich tippe auf ein Threading issue. Synchronisierst du deine Threads nicht? Blockierst du den Event Dispatcher Thread?
 
Ich würde ihn nicht bewusst blockerien, bzw. weiss nicht wie das geht? Teilweise wird die Methode von Threads benützt.
Also Thread X greift auf das GUI zu, wo die Methode addStatus() liegt. Muss ich das speziell synchronisieren, wie eine JTable?
Wenn ich die Fenstergrösse ändere, sollte es ja eigentlich alles neu zeichnen, aber auch das hilft nichts.
 
Kein UI Toolkit ist threadsave, so auch Swing nicht. Veränderst du direkt, oder indirekt die GUI, muss dies über den Event Dispatcher Thread geschehen. Aus anderen Threads heraus muss synchronisiert werden:
SwingUtilities#invokeLater
 
Ich habe das versucht einzubauen, leider nicht ganz mit dem gewünschten Ergebnis. Teilweise werden jetzt meine Statusmeldungen dupliziert:

[highlight=Java]
SwingUtilities.invokeLater(new ReplayDownload(this, replaysToDownload, progressBar));
[/highlight]

Der Thread ReplayDownload ist ein Thread, der die addStatus - Methode einmal oder mehrmals aufruft.
 
Das ist 100% falsch. 🙂
Das invokeLater musst du aus dem anderen Thread aufrufen. Der Teil der Einfluss auf die GUI hat (und nur der) muss dann in ein Runnable geschoben werden und mit invokeLater in die Queue gepostet werden.
 
Achso, vielen Dank. Jetzt hats geklappt (ist noch gut erklärt auf Java Insel). Teilweise habe ich das Gefühl, Java hat mühsame Eigenheiten.
 
Nein, das ist in jeder Programmiersprache, mit jedem grafischen Toolkit so. Es gibt keine Multithread fähigen Toolkits. Die Art und Weise wie synchronisiert wird, ist von Sprache zu Sprache und von Toolkit zu Toolkit verschieden, aber es folgt überall dem gleichen Prinzip.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben