JList aktualisieren während Dateieinlesung

osion

Bekanntes Mitglied
Guten Abend

Situation: Programm list Files ein und gibt in der JList die Namen aus

Was ich will: Während des Einlesen soll die GUI aktualisiert werden, so das der Nutzer sieht das eine Einlesung erfolgt

Problem: Die JList wird nach dem Einlesen aktualisiert, aber nicht während des Einlesens

Ich probierte tausendsachen aus und habe mich Stundenlang im Internet informiert, aber es klappt nicht. Auch habe ich versuch ein repaint der JList.

Ansonsten klappt alles wie gewollt.

Java:
public class BackgroundGuiNameRelease extends SwingWorker<Object, Object>  {
	
	File a;
	
	public BackgroundGuiNameRelease(File a) {
		this.a = a;
	}

	@Override
	protected Object doInBackground() throws Exception {
		
		return a ;
	}

	@Override
	protected void done(){
		//Add Element to File Name for GUI
		try {
			DestkopCleanGui.listModellForListObjectName.addElement(FileSystemView.getFileSystemView().getSystemDisplayName((File) get()));
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Danke für einen Blick reinwerfen.
 
Der SwingWorker funktioniert so, dass du deinen langen Task (in dem Fall also den Code für das Auflisten der Files) in der doInBackground Methode machst. Zwischendurch kannst du dann mittels publish die Werte an die process Methode vom SwingWorker senden, dort wiederum kannst du ohne Probleme deine GUI aktualisieren, bzw. die Strings/Files in deine Liste hinzufügen.

Beispiel:

Java:
	SwingWorker worker = new SwingWorker<Void, String>() {
		@Override
		public Void doInBackground() throws InterruptedException {
			for (File string : folder.listFiles()) {
				publish(string.getName());
				Thread.sleep(1000); //nur für Demozwecke
			}
			return null;
		}

		@Override
		protected void process(List<String> chunks) {
			super.process(chunks);
			for (String string : chunks) {
				((DefaultListModel<String>) list.getModel())
						.addElement(string);
			}
		}

		@Override
		public void done() {
                          //falls du am Ende noch etwas machen willst...ansonsten unnötig!
		}
	};
 
Zuletzt bearbeitet:
Danke für die Antwort. Bis jetzt habe ich noch das gleiche Problem, er aktualisiert am Ende.

Den Teil habe ich nicht Verstanden und somit auch weggelasen, vielleicht könntest du mir den erklären.

Java:
((DefaultListModel<String>) list.getModel())
                        .addElement(string);


Bei mir sieht das jetzt so aus:

Java:
@Override
	protected void process(List<Object> arg0) {
		// TODO Auto-generated method stub
		super.process(arg0);
		
		for (Object fileName : arg0) {
			DestkopCleanGui.listModellForListObjectName.addElement(fileName);
			}
 
Man kennt deinen Rest Code nicht, wir wissen weder was für ein Model du verwendest noch was DestkopCleanGui.listModellForListObjectName ist (sieht generell irgendwie nicht ganz richtig aus)
 
Ablauf:

Zuerst erstelle ich ein e DefaultListModel, so ist die JList dynamisch.

Java:
public static DefaultListModel listModellForListObjectName = new DefaultListModel();


Danach erstelle ich die JList mit dem DefaultListModell als List.

Java:
static public JList listObjectName = new JList(listModellForListObjectName);


Der obligatorischer Rest:

Java:
String[] objectName = new String[] {Messages.getString("DestkopCleanGui.4")}; //$NON-NLS-1$
		for(int i=0; i<objectTyp.length; i++){
			listModellForListObjectName.addElement(objectTyp[i]);
			}
		listObjectName.setEnabled(false);
		listObjectName.setFont(new Font("Tahoma", Font.PLAIN, 16));
		listObjectName.setBackground(new Color(204, 255, 153));
		scrollPaneFileName.setViewportView(listObjectName);

Wenn ich auf den Button "Neu Aufbauen" klicke, so wird die Liste mit den Files erneuert. Er ruft paar Klassen auf und in einer Klasse macht er den Aufruf:

Java:
new BackgroundGuiNameRelease(destktopFileAuflistung).execute();;

Zur GUI

1.ContentPane
2.scrollPanel
3 JList

Am Ende ruft er die Klasse auf die ich beim ersten Post gepostet habe.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben