Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen

RalleYTN

Bekanntes Mitglied
Hallöchen!
Ich habe ein kleines Problem. Ich habe einen JTree der sich am Dateisystem orientiert. Nun gibt es einige Ordner in denen sich mehrere Tausende Dateien befinden können. Wenn man versucht eine TreeNode mit so vielen Elementen zu öffnen, dann dauert das schon mal ein bisschen.
Ich möchte jedoch nicht, dass der Nutzer denkt, dass das Programm abgestürzt ist. Daher dachte ich mir ich mache mir einen modalen Dialog, der eine nette Ladeanimation anzeigt, solange das Program versucht die TreeNode zu öffnen.

Problem: Der modale Dialog blockt den Thread und verhindert, dass das Programm die TreeNode öffnen kann. Und den Prozess, der die TreeNode öffnet kann ich auch nicht in einen SwingWorker stecken, da ich keinen Zugriff darauf habe.

Momentan habe ich folgende Klassen:
Die Klasse, die mir den Dialog erstellt
Java:
public final class LoadingDialog {

   private static JDialog DIALOG;
   
   private LoadingDialog() {}
   
   /**
    *
    * @since 1.0.0
    */
   public static final void create() {
       
       LoadingDialog.DIALOG = new JDialog(Program.NMSME.getFrame(), "Please Wait");
       LoadingDialog.DIALOG.setUndecorated(true);
       LoadingDialog.DIALOG.setModal(true);
       LoadingDialog.DIALOG.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
       LoadingDialog.DIALOG.getContentPane().setLayout(new BorderLayout());
       LoadingDialog.DIALOG.getContentPane().add(new JLabel(Icons.loadIcon("loading.gif")), BorderLayout.CENTER);
       LoadingDialog.DIALOG.setResizable(false);
       LoadingDialog.DIALOG.pack();
       LoadingDialog.DIALOG.setLocationRelativeTo(Program.NMSME.getFrame());
   }
   
   /**
    *
    * @since 1.0.0
    */
   public static final void show() {
       
       LoadingDialog.DIALOG.setVisible(true);
   }
   
   /**
    *
    * @since 1.0.0
    */
   public static final void destroy() {
       
       LoadingDialog.DIALOG.dispose();
   }
}

Hier ist bloß die Methode doWork interressant.
Java:
/**
 *
 * @author Ralph Niemitz/RalleYTN(ralph.niemitz@gmx.de)
 * @version 1.0.0
 * @since 1.0.0
 */
public final class UIUtils {
   
   private UIUtils() {}
   
   /**
    *
    * @param message
    * @return
    * @since 1.0.0
    */
   public static final int promptWarning(String message) {
       
       return JOptionPane.showConfirmDialog(Program.NMSME.getFrame(), message, "Warning!", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE);
   }
   
   /**
    *
    * @param message
    * @return
    * @since 1.0.0
    */
   public static final int promptError(String message) {
       
       return JOptionPane.showConfirmDialog(Program.NMSME.getFrame(), message, "Error!", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
   }
   
   /**
    *
    * @return
    * @since 1.0.0
    */
   public static final JSeparator createSeperator() {
       
       JSeparator seperator = new JSeparator(JSeparator.VERTICAL);
       seperator.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
       return seperator;
   }
   
   /**
    *
    * @param runnable
    * @since 1.0.0
    */
   public static final void doWork(Runnable runnable) {
       
       LoadingDialog.create();
       
       new SwingWorker<Void, Void>() {
           
           @Override
           protected Void doInBackground() throws Exception {
               
               runnable.run();
               return null;
           }
           
           @Override
           protected void done() {
               
               LoadingDialog.destroy();
           }
           
       }.execute();
       
       LoadingDialog.show();
   }
}

Die Implementation der Listener notwending abzufragen, ob eine TreeNode geöffnet wird und geöffnet wurde.
Java:
    private class Adapter implements TreeExpansionListener, TreeWillExpandListener {

       private boolean done;
       
       @Override
       public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
           
           
       }

       @Override
       public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
           
           this.done = false;
           
           UIUtils.doWork(() -> {
               
               while(!this.done) {}
           });
       }

       @Override
       public void treeCollapsed(TreeExpansionEvent event) {
           
           this.done = true;
       }

       @Override
       public void treeExpanded(TreeExpansionEvent event) {
           
           
       }
   }

Hat jemand eine Idee, wie man das lösen kann? :confused:
 

RalleYTN

Bekanntes Mitglied
Wenn du uns mal erklärst was das bedeutet....
Im Anhang findest du ein Bild mit grafischen Element, was zuerst das Will-Expand-Event triggered und dann versucht die TreeNode zu öffnen, sobald der Prozess beendet ist wird das Expanded-Event getriggered. Das Funktioniert jedoch irgendwo intern im JTree, DefaultMutableNode, TreeModel oder irgendwo anders. Der SwingWorker ist eine Klasse, die seit Java 7(glaube ich) bereitgestellt wird für Hintergrundprozesse die nicht im selben Thread laufen sollen, wie das UI.

Die doWork Methode in der UIUtils Klasse zeigt wie man einen SwingWorker implementiert.
 

Anhänge

  • example.png
    example.png
    1,6 KB · Aufrufe: 20

Thallius

Top Contributor
Ich weiß was ein Swingworker ist und natürlich wird es möglich sein deinen Tree aus einem Hintergrundprozess heraus zu füllen. Da ich noch nicht damit gearbeitet habe würde ich persönlich, wenn ich es denn nutzen wollte, wohl mal mit dem Lesen der Doku dazu anfangen...
 

RalleYTN

Bekanntes Mitglied
Nach langem Suchen bin ich jetzt einen Schritt weiter, jedoch noch nicht bei der Lösung.
Also ich muss im JTree die Methode expandPath überschreiben und dann, dass was in der Superklasse normalerweise ausgeführt wird in einen SwingWorker stecken.

Java:
@Override
public void expandPath(TreePath path) {
               
    UIUtils.doWork(() -> super.expandPath(path));
}

Dabei ist mir jedoch ein selstames Verhalten des Programms aufgefallen. Auf einmal lässt sich der TreeNode extrem schnell öffnen und zeigt alle Childs an. Der Ladedialog wird dann wieder geschlossen und das Programm hängt erstmal die restliche Zeit die es normalerweise zum Öffnen des Nodes gebraucht hätte.
 

Thallius

Top Contributor
Das kann ja auch nicht funktionieren. Wenn Du das, was normalerweise synchron abläuft nun asynchron startest, dann wartet der task ja nicht mehr auf das Ergebnis sonder führt einfach weiter fort. Du must das super extendpath erst aufrufen wenn der Swingworker fertig ist.
 

RalleYTN

Bekanntes Mitglied
Das kann ja auch nicht funktionieren. Wenn Du das, was normalerweise synchron abläuft nun asynchron startest, dann wartet der task ja nicht mehr auf das Ergebnis sonder führt einfach weiter fort. Du must das super extendpath erst aufrufen wenn der Swingworker fertig ist.
Der Dialog sollte eigentlich den Thread pausieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
hdi Swing Bzgl JFrame & modaler Dialog AWT, Swing, JavaFX & SWT 6
N Modaler Dialog wird nicht angezeigt AWT, Swing, JavaFX & SWT 8
K Modaler Dialog aber trotzdem Aktualisierung des MainFrames AWT, Swing, JavaFX & SWT 6
P Swing modaler dialog AWT, Swing, JavaFX & SWT 3
H nicht modaler Dialog verdeckt modalen Dialog AWT, Swing, JavaFX & SWT 5
F Modaler Dialog von außen schließen? AWT, Swing, JavaFX & SWT 3
thE_29 Modaler Dialog - close on not focus AWT, Swing, JavaFX & SWT 3
Dit_ SwingUtilities.invokeLater und Modaler JDialog AWT, Swing, JavaFX & SWT 11
P Blockierende Methode im EDT, modaler JDialog AWT, Swing, JavaFX & SWT 4
loadbrain modaler JDialog AWT, Swing, JavaFX & SWT 4
lin modaler JDialog mit #dispose() schliessen ? AWT, Swing, JavaFX & SWT 4
R modaler JDialog legt anwendungscode lahm AWT, Swing, JavaFX & SWT 6
MiHimbert Rückmeldung an den aufrufenden JAVAFX-Dialog AWT, Swing, JavaFX & SWT 1
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
L Swing Files abspeichern mit Save as Dialog Fenster AWT, Swing, JavaFX & SWT 5
N JavaFX Vor beenden der Anwendung durch klicken von X Dialog zeigen AWT, Swing, JavaFX & SWT 1
melaniemueller Confirmation Dialog erstellen AWT, Swing, JavaFX & SWT 18
C Swing Aufruf der Funktion (die ein Dialog anzeigt) über Symbol anzeigen lassen AWT, Swing, JavaFX & SWT 4
H Eigener Dialog mit Rückgabe -> Warten auf Button AWT, Swing, JavaFX & SWT 3
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
C FileChooser Save-Dialog zeigt Files nicht an AWT, Swing, JavaFX & SWT 3
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
E Swing Dialog modal aufrufen AWT, Swing, JavaFX & SWT 2
T JavaFX Dialog schließt ohne dass es schließen soll AWT, Swing, JavaFX & SWT 1
T JOptionPane Dialog plus Rechnung ausgeben AWT, Swing, JavaFX & SWT 1
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
J JavaFX Dialog - Style AWT, Swing, JavaFX & SWT 6
D Swing Dynamisches Dialog UI AWT, Swing, JavaFX & SWT 8
H JFileChooser Dateinamen vorgeben (Save Dialog) AWT, Swing, JavaFX & SWT 9
D Neues Dialog Mittig auf dem Bildschirm AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Grafikproblem nach Aufruf von JColorChooser-Dialog AWT, Swing, JavaFX & SWT 6
M Java FX Innerhalb einem FXML-Dialog weiteren FXML-Dialog einblenden AWT, Swing, JavaFX & SWT 3
T SWT SWTBot Test: Dialog soll sich öffnen,wenn button gedrückt AWT, Swing, JavaFX & SWT 3
G Datei öffnen Dialog modifizieren AWT, Swing, JavaFX & SWT 13
W SWT Dialog richtig schließen? AWT, Swing, JavaFX & SWT 0
M Benutzer-Dialog ohne System.in/out AWT, Swing, JavaFX & SWT 2
P JOptionPane input und show Message Dialog AWT, Swing, JavaFX & SWT 5
F Dialog mit Titel, Text und Ok Button AWT, Swing, JavaFX & SWT 2
TheWhiteShadow SWT Dialog Titel setzen AWT, Swing, JavaFX & SWT 6
VfL_Freak Darstellungsproblem mit Dialog AWT, Swing, JavaFX & SWT 8
P Swing Dialog zeigt keinen Inhalt in Verbindung mit JFrame AWT, Swing, JavaFX & SWT 18
G Nebenläufiger Prozess mit Dialog AWT, Swing, JavaFX & SWT 2
C Swing Fortschrittsanzeige im Dialog ohne Fortschrittsbalken und Abbruchoption AWT, Swing, JavaFX & SWT 7
M Swing Elemente im Dialog neu "laden". AWT, Swing, JavaFX & SWT 6
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
R DnD in modalem Dialog AWT, Swing, JavaFX & SWT 4
I Dialog zum Speichern? AWT, Swing, JavaFX & SWT 16
M Dialog soll etwas an "Oberklasse" übergeben AWT, Swing, JavaFX & SWT 3
qwerqer Swing JDialog Darstellungsprobleme - Dialog lässt sich nicht schließen AWT, Swing, JavaFX & SWT 3
M Datei Speichern unter Dialog - SWT AWT, Swing, JavaFX & SWT 3
J SWT Dialog in Dialog automatisch öffnen AWT, Swing, JavaFX & SWT 19
H Confirm Dialog erweitern AWT, Swing, JavaFX & SWT 5
B Gestaltung eines Optionen-Dialog AWT, Swing, JavaFX & SWT 16
P Swing Option zeitbeschränkt in modalem Dialog anbieten AWT, Swing, JavaFX & SWT 2
X Einem JFrame einen Dialog als Parent setzen. Möglich? AWT, Swing, JavaFX & SWT 4
L AWT Window, Dialog und verschiedene Betriebssysteme AWT, Swing, JavaFX & SWT 2
T SWT Window Builder Pro File Dialog anzeigen AWT, Swing, JavaFX & SWT 10
A Swing Delay (1-4 Sek.) bei JTable und Dialog beim ersten Ausführen AWT, Swing, JavaFX & SWT 3
P SWT Dialog AWT, Swing, JavaFX & SWT 3
O Login Dialog zweimal öffnen AWT, Swing, JavaFX & SWT 2
B Datei öffnen Dialog AWT, Swing, JavaFX & SWT 9
N Swing eigenen Dialog erstellen AWT, Swing, JavaFX & SWT 8
C Swing Fehlermeldung in einem Dialog anzeigen AWT, Swing, JavaFX & SWT 2
L Dialog mit Dauerschleifen AWT, Swing, JavaFX & SWT 4
K SWT TableViewer refresh() im Dialog AWT, Swing, JavaFX & SWT 2
Semox Swing FileSaveAs Dialog Problem AWT, Swing, JavaFX & SWT 14
H Sub-Dialog von modalem JDialog aus aufrufen - geht das? AWT, Swing, JavaFX & SWT 6
B Dialog aus DB Struktur erstellen AWT, Swing, JavaFX & SWT 4
D URL Dialog AWT, Swing, JavaFX & SWT 2
B Swing Keylistener fuer Dialog-Buttons AWT, Swing, JavaFX & SWT 2
J nicht weckklickbarer dialog AWT, Swing, JavaFX & SWT 15
S Frame - Panel - Dialog rückgabe wert AWT, Swing, JavaFX & SWT 5
D Swing Dialog schließen verhindern bei Fehleingabe AWT, Swing, JavaFX & SWT 2
F JColorChooser NICHT im Dialog AWT, Swing, JavaFX & SWT 12
C Swing Mit jTree ein Ordneröffnen Dialog machen? Und Ordner Inhalt auslesen? AWT, Swing, JavaFX & SWT 4
N SWT Dialog mit swt-widgets AWT, Swing, JavaFX & SWT 5
L AWT Daten vom Dialog an Frame senden AWT, Swing, JavaFX & SWT 3
Lurch Swing Dialog erbt von Dialog? AWT, Swing, JavaFX & SWT 28
eQuest Durchsuchen Dialog AWT, Swing, JavaFX & SWT 6
D ausgewählte Textstellen scheinen durch Dialog durch AWT, Swing, JavaFX & SWT 7
S Modalen Dialog nachbauen..? AWT, Swing, JavaFX & SWT 4
E Swing Rückgabe eines Wertes aus einem Dialog zu einem Dialog AWT, Swing, JavaFX & SWT 4
W Swing Problem beim Passwort Dialog AWT, Swing, JavaFX & SWT 4
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
C requestFocus bei modalem Dialog AWT, Swing, JavaFX & SWT 3
5 Mod.Dialog reagiert n.auf ActionListener seiner Komponenten AWT, Swing, JavaFX & SWT 4
A Bitte warten Dialog AWT, Swing, JavaFX & SWT 4
G SWT Dialog AWT, Swing, JavaFX & SWT 7
GilbertGrape EXIT_ON_CLOSE in Dialog AWT, Swing, JavaFX & SWT 3
T JFileChooser: beim Save Dialog einen Dateinamen vorgeben? AWT, Swing, JavaFX & SWT 6
K Druck-Dialog AWT, Swing, JavaFX & SWT 4
D JTable nach Öffnen-Dialog umbaun AWT, Swing, JavaFX & SWT 5
K Dialog schliesst sich nicht. Warum? AWT, Swing, JavaFX & SWT 11
K Automatisch einen Dialog schliessen AWT, Swing, JavaFX & SWT 15
J dialog AWT, Swing, JavaFX & SWT 5
S Probl. bei Java Programm - Dialog zum Bearbeiten von Bildern AWT, Swing, JavaFX & SWT 4
W Wie macht man so nen Settings Dialog AWT, Swing, JavaFX & SWT 2
K Datei öffnen Dialog AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben