File-Objekte an JList übergeben und abrufen

crossrider

Mitglied
Hallo alle zusammen,

ich stehe gerade vor dem Problem, dass ich ein Array aus File-Objekten in einer JList speichern will und diese danach auch wieder zur weiteren Verarbeitung daraus abrufen will. An Letzterem scheitere ich jedoch: Zwar kann ich die Files anscheinend ohne Probleme an die JList übergeben, aber ich weiß nicht wie ich sie wieder herausbekomme 🙂 Das File-Array kommt von einem FileChooser und wird mit der folgenden Methode in die JList eingefügt:

Java:
model = new DefaultListModel();
datlist = new JList(model);

public void setListContent(File[] dateien) {
				
		File[] files = dateien;
				for (File f : files) {
					ListObject lo = new ListObject();
					lo.setFile(f);
					model.addElement(lo);
					
				}
			}

Die Definition für das ListObject ist in einer eigenen Klasse gespeichert, aber es gelingt mir nicht, auf die dort festgelegten Methoden wie getFile() oder getFiles() zuzugreifen.

Java:
public class ListObject {
	public File file = null;
	public File[] files = null;

	public File getFile() {
		return file;
	}
	
	public File[] getFiles() {
		return files;
	}

	public void setFile(File file) {
		this.file = file;
	}

	public String toString() {
		return file.getName();
	}
}

Habt ihr einen Tipp für mich? Normalerweise bekomme ich die Inhalte der JList über jlist.getModel().getElementAt(i) - hier will ich aber an die File-Objekte, nicht an die Strings ran. Wie mache ich das? Danke schonmal für eure Hilfe!
 
das sieht erstmal so aus als würden schöne ListObjects in der Liste stehen,
was geht denn konkret schief, klappt der Cast auf ListObject nicht?

poste doch deinen Code von der GUI und vom Abfragen eines Elementes,

wobei ein File letztlich nur ein Miniwrapper um einen String ist, könntest du auch neu erstellen
 
Genau, ich versuch von Object zu File zu konvertieren, wobei der Cast scheitert.

Hier mein Versuch:
Java:
public File[] gewaehlte_dateien(JList liste) {

		JList filelist = liste;
		
		File[] files = new File[filelist.getModel().getSize()];
		for (int i=0; i<filelist.getModel().getSize(); i++) {
			File datei = ((File) filelist.getModel().getElementAt(i));
		    files[i] = datei;

		    //Object item = filelist.getModel().getElementAt(i);
		}

Und hier das Ergebnis:

Java:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: ListObject cannot be cast to java.io.File
	at JPanel_b_center.gewaehlte_dateien(JPanel_b_center.java:53)
	at JPanel_b_center.actionPerformed(JPanel_b_center.java:136)

Grundsätzlich stelle ich mir aber die Frage, wie ich überhaupt auf meine in ListObject definierten Methoden zugreifen kann. Egal was ich versuche: nie bekomme ich getFile() oder getFiles() angezeigt wenn ich über jlist.getModel() gehe. Wie komme ich also auf die ListObjects von meiner jlist aus??
 
die Fehlermeldung sagt dir doch, dass du da ListObject aus der Liste holst?!
die musst du auf ListObject casten, dann kannst du auch entsprechende Methoden aufrufen,
gleich auf File casten geht nicht

leider erst zu spät genauer geschaut als ich selber die Fehlermeldung auch schon hatte,
so sieht übrigens ein vollständiges Testprogramm aus:

Java:
public class TestGUI extends JFrame {
    DefaultListModel model;
    JList datlist;

    public TestGUI()  throws Exception {

        model = new DefaultListModel();
        datlist = new JList(model);

        add(datlist);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 300);
        setVisible(true);

        Thread.sleep(1000);
        setListContent(new File[] {new File("A"), new File("B"), new File("C"),});

        System.out.println(Arrays.toString(gewaehlte_dateien(datlist)));
    }

    public void setListContent(File[] dateien) {
        File[] files = dateien;
        for (File f : files)   {
            ListObject lo = new ListObject();
            lo.setFile(f);
            model.addElement(lo);
        }
    }

    public File[] gewaehlte_dateien(JList liste) {
        JList filelist = liste;
        File[] files = new File[filelist.getModel().getSize()];
        for (int i = 0; i < filelist.getModel().getSize(); i++)  {
            File datei = ((File)filelist.getModel().getElementAt(i));
            files[i] = datei;

            // Object item = filelist.getModel().getElementAt(i);
        }
        return files;
    }

    public static void main(String[] args)  throws Exception {
        new TestGUI();
    }
}


class ListObject {
    public File file = null;
    public File[] files = null;

    public File getFile() {
        return file;
    }

    public File[] getFiles()  {
        return files;
    }

    public void setFile(File file)  {
        this.file = file;
    }

    public String toString()  {
        return file.getName();
    }
}
kopieren, laufen lassen, selber Fehler vorhanden zum Testen
 
Vielen Dank SlaterB, ich habe die Methode nun entsprechend angepasst. Das war mal wieder einer meiner Anfängerfehler. Jetzt stehe ich aber wieder auf dem Schlauch: Wenn ich meine Methode durchführe, dann sehe ich dass er in der for-Schleife alle Dateien korrekt verarbeitet. Mein return-Statement (dateien) bleibt aber weiterhin null. Habe ich irgendetwas vergessen einzufügen?

Java:
public File[] gewaehlte_dateien(JList liste) {

		JList filelist = liste;
		
		File[] files = new File[filelist.getModel().getSize()];
		for (int i=0; i<filelist.getModel().getSize(); i++) {
			ListObject datei = ((ListObject) filelist.getModel().getElementAt(i));
			files[i] = datei.getFile();
	    
		}
		
			
		return dateien;
	}
 

Zurück
Oben