Wie mache ich es, dass pro ordner ein JButton hinzugefügt wird?

1 Antwort

(...) doch ich weiß nicht wie ich es mache, dass ein JButton hinzugefügt wird wenn ein Ordner, da ist (...)

Immer wenn du weißt, dass sich die Ordnerauswahl geändert hat, kannst du dir die verfügbaren Verzeichnisse via Einzeiler holen:

var directories = new File("/your/root/path").listFiles(File::isDirectory);

Statt allerdings mit Buttons zu arbeiten, würde ich zur Auflistung der Seiten eine JTree-Komponente verwenden. Schau dir dazu den Artikel aus den Oracle Tutorialseiten an: Du kannst ein Model-Objekt an die Komponente binden, welches die Einträge enthält. Wenn sich das Model-Objekt ändert, wird die GUI-Komponente automatisch aktualisiert.

Um zu erfahren, welchen Eintrag ein Nutzer selektiert, kannst du einen TreeSelectionListener an die Komponente hängen. Du könntest dir dann den selektierten Modeleintrag holen, und dessen Detailtext (sofern es sich um einen Artikel handelt) in ein Label o.ä. hineinsetzen.

Versuche für deine Anwendung generell, via MVC-Architektur Daten und Oberflächenlogik strikt voneinander zu trennen. Änderungen des Models können via PropertyChangeListener an die Oberfläche übermittelt werden. Änderungen seitens der Oberfläche werden mittels Controllers (Listener) an die Model-Schicht übertragen.

(...) und dann, wenn man darauf klickt, dass dann der inhalt der Datei angezeigt wird (...)

Der Dateiinhalt sollte möglichst nur dann gelesen werden, wenn eine inhaltliche Änderung erwartbar ist. Bei vielen Dateien ist ein lazy load-Ansatz ratsam. Wenn der Datensatz das erste Mal tatsächlich aufgerufen wird, wird der Inhalt gelesen und in das Model gespeichert. Bei Folgeaufrufen kann man sich den Text aus dem Model holen. Es sei denn, es ist klar, dass zuvor eine Datenaktualisierung getätigt wurde.

Zuletzt noch ein paar Anmerkungen zu deinem Code:

1) Die invokeLater-Methode kann auch mit Lambda-Ausdrücken umgehen, was also eine Verkürzung des Codes bedeutet:

SwingUtilities.invokeLater(() -> new Frame());

2) Der Labeltext kann via Konstruktor gesetzt werden. Das Gleiche gilt für Buttons. Der setVisible-Aufruf ist nur für die JFrame-Instanz nötig.

JLabel l0 = new JLabel(".");

3) Auf nichtssagende Bezeichner wie l0, l1, b1, u.ä. würde ich verzichten. Benenne die Variablen doch nach ihrem Zweck (z.B. titleLabel, startButton, o.ä.), damit du später sofort weißt, auf welche konkrete Komponente sie referenzieren.

4) Wenn du Komponenten (JComponent-Klassen wie JPanel) neu zeichnen möchtest, dann nutze die paintComponent-Methode, nicht paint. Sie ist konkret für deinen Anwendungsfall da.

Die paint-Methode hingegen erfüllt eine übergeordnete Aufgabe: Sie ruft paintComponent auf und zeichnet zudem Ränder und Kindkomponenten.

5) Mit dem Festsetzen der Fenstergröße und anschließend absoluten Positionierung der Komponenten bist du auf dem besten Weg, eine nutzerunfreundliche, bzw. für einige Nutzer sogar unbedienbare grafische Oberfläche aufzubauen.

Nebenher machst du es dir selbst noch schwer: Beim Einfügen neuer Komponenten musst du Koordinaten und Größen anderer Komponenten gegebenfalls aufwendig umordnen. Wenn es zu fehlerhaften Darstellungen (fehlende Ränder, Flimmereffekte/nicht sichtbare Komponenten, u.ä.) kommt, bräuchtest du dich ebenso nicht wundern. Es hängt meist mit fehlerhaften Größenberechnungen/-aufteilungen und null-Layouts zusammen.

Vergiss besser setBounds, entferne auch den setResizable-Aufruf und beschäftige dich mit Layout Managers. Sie sind eines der zentralen Konzepte von Swing. Selbst für den Fall, dass du sie zu kompliziert findest, gibt es noch Ausweichmöglichkeiten wie Drag & Drop-Designer (GUI Designer in IntelliJ / Matisse in NetBeans / WindowBuilder in Eclipse), die dir letzten Endes deutlich bessere Ergebnisse liefern, als mit deinem Ansatz.

Solltest du deine bisherige Vorgehensweise (setBounds, paint, ...) so aus einer bestimmten Lernquelle bezogen haben, würde ich dir raten, diese schleunigst zu entsorgen.

Stattdessen (und generell) würde ich dir empfehlen, mehr mit den Oracle Tutorials zu arbeiten. Sie stellen alle Konzepte und Komponenten genau vor und bieten dazu sogar noch komplette Praxisbeispiele.