# JDialog statt JFrame



## Monkeyspeaker (1. Feb 2013)

Also ich will auf einem JDialog den Fortschritt eines Prozesses per JProgressBar anzeigen - soweit so gut 
Ich will zusätzlich dem Dialog einen Owner zuweisen und modal machen - auch das ist kein Problem.
Ich hab vorher einen JFrame benutzt (den man nicht modal setzen kann), aber bei dem JDialog läuft der Compiler nicht weiter (beim Frame schon - so kann man schön den Fortschritt anzeigen) 
Also kennt ihr vil einen Weg das sich der Dialog genauso verhält wie ein Frame oder das man einen Frame einen Owner zuweisen kann und modal setzen kann? 
Lg Monkey


----------



## Camino (1. Feb 2013)

modal bedeutet doch, dass es in dem anderen Fenster erst dann weitergeht, wenn der Dialog beendet/geschlossen wurde. Was genau passiert denn während dem Dialog in deinem aufrufenden Fenster?


----------



## Monkeyspeaker (1. Feb 2013)

Ich habs aber auch versucht wie der Dialog nicht modal war und der Compiler hat trozdem nicht weiter gemacht.
Ich will nur das der Dialog modal ist damit man nicht auf den Parent gehen kann und wieder sachen öffnen kann. 
Es werden DatenbankLinks geprüft. dies erfolgt in einer for-schleife und jedesmal wenn diese durchlaufen wird wird das im Dialog/Frame angezeigt.


----------



## anti-held (1. Feb 2013)

Was bringt der Compiler denn für eine Fehlermeldung?


----------



## Monkeyspeaker (1. Feb 2013)

Keine er bleibt einfach stehen sobald der Dialog angezeigt wird


----------



## anti-held (1. Feb 2013)

Ich denke mal dass das Problem folgendes ist:
Der Main-Frame ist gerade blockiert, weil er wartet, bis der Dialog fertig ist.
Der Dialog jedoch muss warten, bis der Main-Frame nicht mehr blockiert ist, um seine Änderungen vorzunehmen.
Könnte das zutreffen?


----------



## Camino (1. Feb 2013)

Monkeyspeaker hat gesagt.:


> Es werden DatenbankLinks geprüft. dies erfolgt in einer for-schleife und jedesmal wenn diese durchlaufen wird wird das im Dialog/Frame angezeigt.



Brauchst du dafür denn überhaupt den Dialog? Oder würde es auch gehen, wenn du die Anzeige im Frame machst? Evtl. musst du die Überprüfung in einen Thread/SwingWorker auslagern, damit die Anzeige nicht blockiert wird.


----------



## Monkeyspeaker (1. Feb 2013)

Den Dialog brauch ich damit ich den MainFrame blockiere das man nicht während getsetet wird andere Prozesse starten kann.


----------



## Monkeyspeaker (1. Feb 2013)

@Anti-Held 
ja muss so sein
Mein Ziel ist es den MainFrame zu blockiern (damit keine weiteren Prozesse gestartet werden bis das Testen fertig ist) aber das trozdem der Compiler weitergeht um zu Testen


----------



## anti-held (1. Feb 2013)

Du musst deine Änderungen am Main-Frame herausnehmen und erst nachdem dein Dialog weg ist, anwenden.
Denn sonst bist du in der oben beschriebenen Dead-lock situation


----------



## Camino (1. Feb 2013)

Monkeyspeaker hat gesagt.:


> Den Dialog brauch ich damit ich den MainFrame blockiere das man nicht während getsetet wird andere Prozesse starten kann.



Hmm, einen Dialog nur dafür zu nutzen, damit der MainFrame blockiert wird, finde ich etwas fragwürdig. Das Blocken des MainFrames kannst du doch bestimmt auch anders hinkriegen, also dass erst wieder andere Prozesse gestartet werden können, wenn der Test vorbei ist.


----------



## Monkeyspeaker (1. Feb 2013)

wär warscheindlich um einiges leichter :bloed:


----------



## anti-held (1. Feb 2013)

Er will doch eine Fortschrittsanzeige darstellen.
Wenn diese nicht benötigt würde, könnte man einfach die möglichen buttons mit

```
Component.setEnabled(false)
```
 nicht benutzbar machen.


----------



## Monkeyspeaker (1. Feb 2013)

werd schon ganzschön verwirrt ... Gottseidank ist Freitag 
Also was sagt ihr? ist es besser den MAin-Frame per Dialog zu blockiern oder anders oder die möglichen Buttons auf enable zu setzen?


----------



## anti-held (1. Feb 2013)

Ich finde den ProgressDialog schon schön...(Meine Meinung)

Hab mich daran erinnert, dass du es warst dem ich Gestern in nem anderen Thread geholfen habe...
Hab mir den Code nochmal angesehen, und unter der Vorraussetzung dass es sich noch um das
selbe Projekt handelt,
versuche doch mal diese beiden Zeilen in deinem Code:

```
dbLinkTree.setModel(m);
            progressFrame.setVisible(false);
```

durch diese auszutauschen:

```
progressFrame.dispose();
           dbLinkTree.setModel(m);
```


----------



## Monkeyspeaker (1. Feb 2013)

allerdings  
Habs versucht aber leider gleiche Situation wie zuvor

```
if(fromFileChooser == true){
//                this.setEnabled(false);
                setProgressingDialog();
            }
             TreeNode root = null;
            root = buildDBLinkTree(rootPath, files);
            DefaultTreeModel m = new DefaultTreeModel(root);
            progressDialog.dispose();
            dbLinkTree.setModel(m);
//            progressDialog.setVisible(false);
//            this.setEnabled(true);
            dbLinkTree.setRootVisible(true);
        }
    }
```
hier die Methode 
	
	
	
	





```
setProgressingDialog()
```


```
ublic void setProgressingDialog() {
        progressDialog = new JDialog(this, true);                //("NTSWincash DBLinkConnectionTester");
//        progressDialog.setTitle("NTSWincash DBLinkConnectionTester");
        ImageIcon img = new ImageIcon("D:/workspaces/HEAD/DBLinkTester/data_base_connection.png");
        progressDialog.setIconImage(img.getImage());
        progressDialog.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        progressDialog.setBounds(750, 500, 225, 125);

        JPanel progressPanel = new JPanel(new MigLayout());
        informationLabel = new JLabel("Testing ...");
        progressPanel.add(informationLabel, "wrap");

        progressBar = new JProgressBar();
        progressPanel.add(progressBar, "grow 100,wrap");

        cancelButton = new JButton("cancel");
        progressPanel.add(cancelButton,  "right");

        progressDialog.add(progressPanel);
        progressDialog.setVisible(true);
        }
```
sobald der Compiler zu 
	
	
	
	





```
progressDialog.setVisible(true);
```
 kommt wird der Dialog aufgerufen und der Main-Frame blovkiert und es geht nichts mehr


----------



## anti-held (1. Feb 2013)

poste doch bitte mal deine buildDBLinkTree - Methode...
Ich glaube dass darin das Problem steckt.
Es wird irgendetwas vom Main-Thread aufgerufen, auf das gewartet werden muss.


----------



## Monkeyspeaker (1. Feb 2013)

```
public TreeNode buildDBLinkTree(final String rootPath, final List<File> list) {


        DBLinkTester tester = new DBLinkTester();
        Map<String, DefaultMutableTreeNode> nodes = new HashMap<String, DefaultMutableTreeNode>();

        DefaultMutableTreeNode root = new DefaultMutableTreeNode();
        nodes.put(rootPath, root);
        progressBar.setString("0/" + list.size());
        progressBar.setStringPainted(true);
        progressBar.setMaximum(list.size());

        for(int i = 0; i < list.size(); i++) {
            informationLabel.setText("Testing " + i + " from " + list.size() + " DBLink-Files");
            progressBar.setString(i + "/" + list.size());
            progressBar.setValue(i);
            File file = list.get(i);
            String fileName = file.getName();

            Boolean workingDBLink = tester.testDBLinkConnection(file);
            DefaultMutableTreeNode fileNode = createNode(fileName, workingDBLink, file);
            if(workingDBLink == false){
                faildDBLinks.add(fileNode);
            }

            DefaultMutableTreeNode parentNode = getParentNode(nodes, file);
            parentNode.add(fileNode);
        }
        return root;
    }
```
liegts an den variablen oder doch an den Methoden 
	
	
	
	





```
createNode
```
 und 
	
	
	
	





```
getParentNode
```
Ich blick heute echt nicht mehr durch 
Achja is mal ein dickes Danke angebracht :toll:


----------



## anti-held (1. Feb 2013)

versuche mal das hier:


```
if(fromFileChooser == true){
//                this.setEnabled(false);
                setProgressingDialog();
            }
             TreeNode root = null;
            root = buildDBLinkTree(rootPath, files);
```

wird ersetzt durch:


```
final TreeNode root;
            new Thread(new Runnable(){
               public void run(){
                  root = buildDBLinkTree(rootPath, files);
               }
            }).start();
            if(fromFileChooser == true){
                setProgressingDialog();
            }
```

edit:
natürlich muss dann auch ganz unten in die Methode buildDBLinkTree
die Anweisung:

```
progressDialog.dispose();
```


----------



## Monkeyspeaker (1. Feb 2013)

Hm das is jetzt blöd weil sowohl progressBar und informationLabel in 
	
	
	
	





```
setProgessDialog()
```
 erstellt werden 
auserdem wird voll lange getestet und dann erst der Dialog angezeigt 
ps: wie soll das gehen wenn in 
	
	
	
	





```
buildDBLink()
```
 der fortschritt angezeigt wird auf der progressBar ...


----------



## anti-held (1. Feb 2013)

Das Problem ist, dass der Dialog erstellt wird und bei setVisible wird der Main-Frame solange blockieren, bis der Dialog
fertig ist.
Das passiert erst, wenn dispose darauf aufgerufen wird.
Das sollte aber der Main-Frame machen, welcher blockiert ist!
-> Deadlock

Also müssen die Frames für das GUI-Element und der Thread, der die berechnungen macht gleichzeitig laufen.
Die Progressbar musst du halt dann vorher schon mit 0 initialisieren.


----------



## Monkeyspeaker (1. Feb 2013)

puh echt zimlich blöd dass hätte ich beachten sollen bevor ich zum coden angefangen habe 
Naja ich werd das glaub ich mal auf nächste Woche verschieben 
Aber danke nochmal für deine Mühe


----------



## bERt0r (1. Feb 2013)

Deine BuildDBLinkTree Methode muss auf einem eigenen Thread laufen, z.B SwingWorker (Worker Threads and SwingWorker (The Java™ Tutorials > Creating a GUI With JFC/Swing > Concurrency in Swing)). Ansonsten wird der EDT blockiert und die GUI ändert sich nicht.
Übrigens: Null Layout = Pfui.


----------

