JList + DefaultListModel = Race Condition :(

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hey...

mir ist grad mehr durch Zufall etwas aufgefallen, worüber ich einfach mal sagen würde, es ist
ne Race Condition (tritt manchmal auf, manchmal nicht).

Um was geht's:

Ich habe eine JList und ein JListModel. Das Model verändere ich während der Laufzeit, ich füge
Nachrichten hinzu (das Model ist eine Art Logger).

Das tue ich mittels

Code:
Log.say("Meine Nachricht");  // Log ist dieses Model (extends DefaultListModel)

Klappt auch soweit, die JList ist an ein JFrame gekoppelt und zeigt diese Nachrichten dann an.

Nur wenn ich ganz schnell hintereinander zweimal diese say()-Methode aufrufe, passiert es manchmal (!),
dass der komplette Fensterinhalt, also alle Log-Nachrichten, verschwinden -> das Fenster (die Liste??) ist leer...

Ich kann mir das überhaupt nicht erklären, scheinbar ist ihm das einfach "zu schnell".
Ich habe alle Methoden, die meiner Meinung nach mit diesem ganzen Observern-Pattern zu tun haben,
mit dem Schlüsselwort synchronized versehen -> Kein Effekt :(

Ich glaube ich kann es euch nicht ersparen, diesen Teil meines Programms zu posten...

Code:
public class Log {

	private static LogListModel model = new LogListModel(new LogConsole());

	public static synchronized void say(String message) {
		model.addElement(message);
	}
}

Code:
public class LogListModel extends DefaultListModel {

	private ArrayList<LogEntry> entries;
	private LogConsole myConsole;

	public LogListModel(LogConsole console) {

		entries = new ArrayList<LogEntry>();
		myConsole = console;  // das ist einfach das JFrame indem alles angezeigt wird.
		myConsole.getList().setModel(this);  // hier wird der JList eben dieses Model übergeben!
		myConsole.setVisible(true);
	}

	@Override
	public synchronized Object getElementAt(int index) {
		return entries.get(index).getMessage();

	}

	public synchronized String getMoreFrom(int index) {
		return entries.get(index).getMore();
	}

	@Override
	public synchronized void addElement(Object o) {
		super.addElement(entries.add(new LogEntry((String) o)));
	}
}

An der JList selbst hab ich nix gemacht, is ne ganz stinknormale new JList(), die eben als Model
mein LogListModel bekommen hat... Keine Ahnung, warum dieser Effekt manchmal auftritt.
Wie gesagt nur, wenn ich zwei mal sofort hintereinander mittels Log.say() etwas logge...

Was vllt auch noch eine hilfreiche Info sein könnte: Die JList wiederum liegt auf einem JScrollPane, das in
das Fenster gelegt wurde:

Code:
public class LogConsole extends JFrame {

	private JList list;
	private JScrollPane pane;

	public LogConsole() {

		list = new LogConsoleList();
		pane = new LogConsoleScrollPane(list);

		getContentPane().add(pane);
		pack();
	}

        // ...
}


Hat jemand eine Idee, was da los ist? ???:L
 
G

Gast

Gast
Ist das ein externer Thread der die Nachrichten einfügt (Log.say())?
 

hdi

Top Contributor
ja das ist ein extra dafür gestarteter Thread. (ich weiss jetz nich so genau was du mit "extern" meinst, also
ich hab schon eine neue Instanz eines Threads mittels new und start() erzeugt)
in seiner run() Methode ruft der dann diese say-Methoden auf...
 
B

Beni

Gast
Das ist nicht gut, auf die GUI sollte man nur im EventDispatcherThread (EDT) zugreiffen. Swing ist nicht darauf ausgelegt mit mehreren Threads zu arbeiten, deshalb kommt deine Liste vermutlich durcheinander wenn da ein extra Thread reinschreibt.

Du kannst das machen mit:
Code:
Runnable run = new Runnable(){
  public void run(){
    model.addElement( ... );
  }
};
EventQueue.invokeLater( run );
 

hdi

Top Contributor
Oh :shock: Das ist sehr, sehr schlecht :(

Ich hab nämlich später im Programm mehrere Threads, die da alles mögliche loggen...

Und ich hab mir jetzt gedacht, nagut dann starte ich halt ab jetzt jeden Thread so:

Code:
EventQueue.invokeLater ( new EinThreadDenIchStartenWill() );
und rufe das "start()" dann im Konstruktor des Threads auf...
Aber was passiert: NIX! Mein Fenster, das der Thread erstellen sollte, wird nicht erstellt...

Ich habe es auch so probiert:

Code:
EinThread = new EinThread();
EventQueue.invokeLater ( EinThread );
EinThread.start();

...sowie das gleiche nochmal aber das start() vor dem invokeLater() aufgerufen.
Ergebnis in beiden Fällen:
Das Fenster erscheint zwar diesmal ansatzweise, aber total verbuggt, ohne Inhalt und nix passiert.

Heisst das jetzt, mein komplettes LogSystem woran ich schon seit Tagen rumtu, kann ich wegwerfen,
weil nich mehrere Threads das benutzen können wenn ich da Swing Komponenten hab ?

Das wär bitter :autsch: Wie macht man sowas denn? Ich meine... es gibt doch viele Anwendungen (eig. doch
so ziemlich alle?) die mit GUI's arbeiten und trotzdem mehrere Threads haben die irgendwas da verändern etc...
 
G

Gast

Gast
Nein, du musst nur wie Beni geschrieben hat den Aufruf am Model in ein Runnable verpacken und an invokeLater übergeben.
Dann wird das vom Event Dispatcher Thread für dich ausgeführt.
 

hdi

Top Contributor
Das geht nicht... Das Fenster baut sich halb auf und bleibt dann hängen mit einer verbuggten Anzeigen und es ist Schluss... es liegt wohl am sleep() hab ich grad rausgefunden...Das hängt total alles.. :

Code:
import log.Log;

public class LogDemo implements Runnable {
	
	public void run() {
		
		Log.say("WILLKOMMEN ZUR LOG-DEMO !");
		sleep(2000);
		Log.say("Los geht's...");
		sleep(1000);
		Log.say("Das ganze funktioniert in Realtime...");
		sleep(3000);
		Log.say("...und es wird automatisch mitgescrollt:");
		sleep(2500);
		
		for(int i = 0; i<15; i++) {
			Log.say("neue nachricht kommt...");
			sleep(200);
		}
		Log.say("Falls eine Nachricht zu lang ist, wird eine horizontale Scrollbar eingeblendet. (Normalerweise sollte der Platz aber für 'echte' Log-Nachrichten reichen)");
		sleep(9000);
		Log.say("Achso...");
		sleep(2000);
		Log.say("Es gibt auch eine Rollover Funktion.");
		sleep(3000);
		Log.say("Die zeigt genaueres über eine Nachricht");
		sleep(3000);
		Log.say("Einfach mal ausprobieren!");
		Log.say("Das war's!");
	}
	
	public static void sleep(int millis) {
		try {
			Thread.sleep(millis);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

Hab ich das Sleep falsch überschrieben? Wenn ich von Thread erbe, dann funktioniert das... Wieso geht es jetzt
nicht mehr? Ich meine es ist ja ein Thread auch wenn ich das Interface Runnable implementier, is doch eig. das gleiche oder nicht.
Wenn ich nur eine sleep-Anweisung hab geht zB alles, aber er kommt scheinbar mit sovielen sleep-anweisungen nicht zurecht. woran liegt das?
 

Marco13

Top Contributor
Code:
EventQueue.invokeLater ( new EinThreadDenIchStartenWill() );

Nee - eigentlich kann man der Methode eh keinen Thread übergeben, sondern nur ein Runnable, aber das wäre ja auch murks: Die Methode führt das, was ihr übergeben wird, ja im Event-Dispatch-Thread aus - d.h. dann würde der EDT alles machen, was eigentlich deine anderen Threads erledigen sollten.

Auch hier gilt: Du brauchst (eigentlich, wenn du dalles sauber getrennt hast/hättest) nirgendwo irgendwas an deinem eigentlichen Log-System zu ändern - NUR der Aufruf
Code:
void say(String s)
{
    LogEntry logEntry = new LogEntry(s);
    listModel.addElement(logEntry);
}

muss geändert werden, so wie Beni geschrieben hat, bzw in
Code:
void say(String s)
{
    final LogEntry logEntry = new LogEntry(s);
    SwingUtilities.invokeLater(new Runnable()
    {
        public void run()
        {
            listModel.addElement(logEntry);
        }
    });
}
 

hdi

Top Contributor
Ah okay, hatte das auf die Threads selbst bezogen, hab's jetzt geändert.
bekomme allerdings ein Problem:

Wenn ich so ein neues LogEntry erstelle, wird darin folgendes aufgerufen:

Code:
StackTraceElement ste = Thread.currentThread().getStackTrace()[4];

Bisher waren die Infos eben an Index 4, dadurch bedingt wie halt meine Log-Klassen
zusammenhängen.

Jetzt bekomme ich outOfBounds. Wohl deshalb, da ich einen neuen Thread über
SwingUtilities starte, und Thread.currentThread() mir nun diesen liefert.

Problem: Verringere ich den Index, bekomme ich zwar keine OutOfBound Nachricht mehr,
aber in einer Endlosschleife sowas hier:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: log.LogEntry cannot be cast to java.lang.String
at log.LogListModel.addElement(LogListModel.java:31)
at log.Log$1.run(Log.java:14)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Das passiert, egal welchen Index <4 ich ihm übergebe. Warum?

Und das führt mich zu einer weiteren Frage: Bekomme ich aus dem LogEntry heraus dann so
überhaupt noch die Information, welche Methode denn das say() wirklich aufgerufen hat?

Oder muss ich die o.g. Zeile komplett ändern und nix mit currentThread machen, sondern sonst
irgendwie wieder auf meine ursprünglich das say() aufrufende Methode kommen?
 

hdi

Top Contributor
okay hier is mein komplettes programm in einer klasse, kann man so ausführen.
der Fehler tritt in der Klasse LogEntry auf, beim StackTrace...

Code:
import javax.swing.SwingUtilities;
import java.util.ArrayList;
import javax.swing.DefaultListModel;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.awt.Component;
import javax.swing.JScrollPane;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JList;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JScrollPane;

public class Main {
	public static void main(String[] args) {

		new LogDemo().start();
	}
}
class LogDemo extends Thread {
	
	public void run() {
		
		Log.say("erste nachricht");
		sleep(200);
		Log.say("zweite...");
		Log.say("..und dritte");

	}
	
	public static void sleep(int millis) {
		try {
			Thread.sleep(millis);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
class LogListModel extends DefaultListModel {

	private ArrayList<LogEntry> entries;
	private LogConsole myConsole;

	public LogListModel(LogConsole console) {

		entries = new ArrayList<LogEntry>();
		myConsole = console;
		myConsole.getList().setModel(this);
		myConsole.setVisible(true);
	}

	@Override
	public synchronized Object getElementAt(int index) {
		return entries.get(index).getMessage();

	}

	public synchronized String getMoreFrom(int index) {
		return entries.get(index).getMore();
	}

	@Override
	public synchronized void addElement(Object o) {
		super.addElement(entries.add(new LogEntry((String) o)));
	}
}
class LogEntry {

	private final String MESSAGE;
	private final String MOREINFO;

	public LogEntry(String message) {

		this.MESSAGE = message;

		StackTraceElement ste = Thread.currentThread().getStackTrace()[1];
		String caller = ste.getClassName().split("\\.")[1];
		String method = ste.getMethodName();
		int line = ste.getLineNumber();
		SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
		String time = formatter.format(new Date());

		this.MOREINFO = time + " > " + caller + " : " + method + " (" + line
				+ ")";
	}

	public String getMessage() {
		return MESSAGE;
	}

	public String getMore() {
		return MOREINFO;
	}
}
class LogConsoleScrollPane extends JScrollPane {

	public LogConsoleScrollPane(Component list) {

		setViewportView(list);
		setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
		setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_NEVER);

		// die methode finden, die die liste synchronisiert, und
		// die scrollbar nachziehen in dieser methode, und immer die
		// horizontale ganz nach links setzen!
	}
}
class LogConsoleList extends JList {

	public LogConsoleList() {
		setBackground(Color.lightGray);
		setForeground(Color.black);
		setFont(new Font("Arial", Font.PLAIN, 10));
	}

//	@Override
//	public synchronized String getToolTipText(MouseEvent evt) {
//
//		int index = locationToIndex(evt.getPoint());
//		String item = ((LogListModel) getModel()).getMoreFrom(index);
//		return item;
//	}
	
	// ToolTips anpassen !!!
}
class LogConsole extends JFrame {

	private final int X_DIM = 220;
	private final int Y_DIM = 200;
	private JList list;
	private JScrollPane pane;

	public LogConsole() {

		setTitle("LogConsole");
		setPreferredSize(new Dimension(X_DIM, Y_DIM));
		setAlwaysOnTop(true);
		setResizable(false);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		list = new LogConsoleList();
		pane = new LogConsoleScrollPane(list);
		getContentPane().add(pane);
		pack();
		setLocationByTray();
	}

	private void setLocationByTray() {
		int width, height;
		Rectangle visibleDesktop = GraphicsEnvironment
				.getLocalGraphicsEnvironment().getMaximumWindowBounds();
		width = (int) visibleDesktop.getWidth();
		height = (int) visibleDesktop.getHeight();
		this.setLocation(width - X_DIM, height - Y_DIM);
	}

	public JList getList() {
		return list;
	}
}
class Log {

	private static LogListModel model = new LogListModel(new LogConsole());

	public static synchronized void say(String message) {
		{
			final LogEntry logEntry = new LogEntry(message);
			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					model.addElement(logEntry);
				}
			});
		}
	}
}
 

Lim_Dul

Top Contributor
Zeile 69:
Code:
      super.addElement(entries.add(new LogEntry((String) o)));
Warum erzeugt du da eines Neues LogEntry Objekt? Du bekommst doch ein LogEntry Objekt rein. Du kannst das einfach hinzufügen.
 

hdi

Top Contributor
ah, hatte ich jetzt vergessen zu ändern nachdem ich die say() methode geändert hatte...

okay jetzt geht's, danke :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
T Generische Klasse in JList über DefaultListModel AWT, Swing, JavaFX & SWT 1
S JList ist leer, aber DefaultListModel hat die Daten? AWT, Swing, JavaFX & SWT 9
E JList /DefaultListModel mit Datenbank verbinden AWT, Swing, JavaFX & SWT 10
M JList mit DefaultListModel und listener AWT, Swing, JavaFX & SWT 4
P DefaultListModel - jList - getSelectedIndex AWT, Swing, JavaFX & SWT 4
S JList mit DefaultListModel befüllt, wie Objekte selektieren? AWT, Swing, JavaFX & SWT 3
G JList, einzelne Strings hinzufügen AWT, Swing, JavaFX & SWT 9
B Jlist füllen AWT, Swing, JavaFX & SWT 4
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
BananenBrötchen Swing Arraylist in jList anzeigen AWT, Swing, JavaFX & SWT 6
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
cezary Choice, JComboBox oder JList AWT, Swing, JavaFX & SWT 5
J JList scrollen AWT, Swing, JavaFX & SWT 3
Neumi5694 Swing JList - Klick abfangen AWT, Swing, JavaFX & SWT 3
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
M Swing JList Auswahl-GUI-Konzept AWT, Swing, JavaFX & SWT 9
C JList: Bestimmte Objekte ausschließen AWT, Swing, JavaFX & SWT 1
F JList aktualisiert nicht AWT, Swing, JavaFX & SWT 24
F JList auffüllen aus Array von Instanzen AWT, Swing, JavaFX & SWT 4
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
F JList bei Windowbuilder AWT, Swing, JavaFX & SWT 8
F JList zeigt keine Einträge mehr AWT, Swing, JavaFX & SWT 1
P JList erstellen AWT, Swing, JavaFX & SWT 4
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
P Übergeben von ListModel an nichtparametrisierte JList AWT, Swing, JavaFX & SWT 8
M Ein Element in mehreren JList selektieren AWT, Swing, JavaFX & SWT 5
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
Nabbit Über JList kein JPopupMenu AWT, Swing, JavaFX & SWT 2
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
C Swing JList zeigt keine neuen Einträge an AWT, Swing, JavaFX & SWT 1
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
T Swing WindowBuilder: JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
C Hilfe bei JSpinner und JList AWT, Swing, JavaFX & SWT 1
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
M JList wird angezeigt, JTable (DefaultTableModel) nicht AWT, Swing, JavaFX & SWT 7
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
N AWT Markierte Zeile jList aus mySQL DB löschen AWT, Swing, JavaFX & SWT 2
S JList repaint AWT, Swing, JavaFX & SWT 1
F Swing JTextField in JList (Funktion beibehalten) AWT, Swing, JavaFX & SWT 2
H JList AWT, Swing, JavaFX & SWT 5
B Swing Bild von Webseite herunterladen, diese dann in JList anzeigen. AWT, Swing, JavaFX & SWT 1
B Swing Dynamische JList mit Bildern AWT, Swing, JavaFX & SWT 4
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
S JList Index finden AWT, Swing, JavaFX & SWT 6
3 Swing JList-Inhalt als verschlüsselte Datei schreiben und lesen AWT, Swing, JavaFX & SWT 1
N JComponenten in JList oder doch anders? AWT, Swing, JavaFX & SWT 0
S Swing JList, ArrayList + DefaultModel AWT, Swing, JavaFX & SWT 5
B Tabelleneinträge in JList anzeigen AWT, Swing, JavaFX & SWT 5
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
D Swing JList keine Selektionsänderung bei "dragged-Maus" AWT, Swing, JavaFX & SWT 4
M JList Model filtern AWT, Swing, JavaFX & SWT 4
K Swing JList - Element richtig hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
P Swing JList mit Objekten - Name anzeigen AWT, Swing, JavaFX & SWT 5
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
K Mehrfachselektierungen in einer JList AWT, Swing, JavaFX & SWT 6
L Swing Component alignment innerhalb einer JList AWT, Swing, JavaFX & SWT 3
M Swing JList Listener AWT, Swing, JavaFX & SWT 20
M Accelerator zu JMenuItem des JPopupMenu einer JList AWT, Swing, JavaFX & SWT 2
S Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Element aus JList eines JFileChooser entfernen AWT, Swing, JavaFX & SWT 3
E selektierter Datensatz in JList als String Datentyp AWT, Swing, JavaFX & SWT 23
E selektiertes Element aus JList zurückgeben AWT, Swing, JavaFX & SWT 7
L SQL & Jtable o. JList AWT, Swing, JavaFX & SWT 5
K Swing JList und veränderte CellRenderer AWT, Swing, JavaFX & SWT 8
B JList + ListCellRenderer AWT, Swing, JavaFX & SWT 5
B JList -> Disabled AWT, Swing, JavaFX & SWT 6
J JList, Anzeige aktualisieren AWT, Swing, JavaFX & SWT 7
I Jlist isselectionEmpty AWT, Swing, JavaFX & SWT 4
I Jlist dynamisch aus Datenbank füllen AWT, Swing, JavaFX & SWT 14
R Swing unbegrenzte Anzahl vonEinträgen in JList AWT, Swing, JavaFX & SWT 2
MiMa Dateien aus Ordner in einer JList Ausgeben AWT, Swing, JavaFX & SWT 32
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
M JList mit 2-zeiligen Objekten füllen AWT, Swing, JavaFX & SWT 7
S JList mit Einträgen versehen schlägt fehl AWT, Swing, JavaFX & SWT 4
F Swing ArrayList in JList anzeigen und Objekte auswählen AWT, Swing, JavaFX & SWT 2
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
S Fragen zu JList AWT, Swing, JavaFX & SWT 3
B Aktualisierung einer JList AWT, Swing, JavaFX & SWT 5
W JList valueChanges weiterleiten? AWT, Swing, JavaFX & SWT 14
D JButton-Click in JList mit Panels (auf dem der Button ist) AWT, Swing, JavaFX & SWT 6
E Jlist nur mit Klasse? AWT, Swing, JavaFX & SWT 5
D Swing JList <-> AdapterModel <-> Model AWT, Swing, JavaFX & SWT 4
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
B JList nach dem Rendern sortieren AWT, Swing, JavaFX & SWT 3
T Wie ist das "Lookup-Verhalten" von JList, JCombobox änderbar? AWT, Swing, JavaFX & SWT 4
D JList items voneinander trennen AWT, Swing, JavaFX & SWT 10
E Keine Ausgabe von JList bei drücken von Button auf die Konsole AWT, Swing, JavaFX & SWT 7
M gleiches Element in JList mehrmals hintereinander auswählen AWT, Swing, JavaFX & SWT 6
T JList und Objekte AWT, Swing, JavaFX & SWT 7
M Swing JList Item in andere JList während Ausführung AWT, Swing, JavaFX & SWT 4
V JList filtern AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben