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
Hier ist bloß die Methode doWork interressant.
Die Implementation der Listener notwending abzufragen, ob eine TreeNode geöffnet wird und geöffnet wurde.
Hat jemand eine Idee, wie man das lösen kann?
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?