2012-10-29 13 views
5

Potrzebowałem sposobu na pobranie danych z bazy danych i uniemożliwienie użytkownikowi modyfikowania istniejących danych w tym momencie.Bezpiecznie otwórz i zamknij modalny JDialog (przy użyciu SwingWorker)

Stworzyłem SwingWorker, aby zaktualizować bazę danych i modalny JDialog, aby pokazać użytkownikowi, co się dzieje (za pomocą JProgressBar). Modalne okno dialogowe ma domyślną wartośćCloseOperation ustawioną na DO_NOTHING, więc można ją zamknąć tylko za pomocą właściwego połączenia - używam setVisible(false).

MySwingWorkerTask myTask = new MySwingWorkerTask(); 
myTask.execute(); 
myModalDialog.setVisible(true); 

SwingWorker robi pewne rzeczy w ciągu doInBackground() i wreszcie wzywa go:

myModalDialog.setVisible(false); 

Moim jedynym zmartwieniem i moje pytanie: Czy jest możliwe, że SwingWorker wykonuje setVisible(false) zanim będzie setVisible(true) w linia po spawn pracownika?

Jeśli tak, to setVisible(true) może blokować na zawsze (użytkownik nie może zamknąć okna modalnego).

Czy muszę zaimplementować coś jak:

while (!myModalDialog.isVisible()) { 
    Thread.sleep(150); 
} 
myModalDialog.setVisible(false); 

, aby upewnić się, że rzeczywiście dostać zamknięte?

+1

należy zadzwonić 'myModalDialog.setVisible (false)' 'zrobić w()' zamiast 'doInBackground()'. Dlaczego nie nazwiesz 'setVisible (true)' przed 'execute'? – assylias

+0

setVisible (true) to połączenie blokujące – user1713059

+0

Haha - bardzo dobry punkt :-) – assylias

Odpowiedz

3

Generalnie tak.

Co chciałbym zrobić to w sposób doInBackground jest używać SwingUtilities.invokeLater aby wyświetlić okno dialogowe, w swojej metodzie done ukryć okno.

powinno to oznaczać, że nawet jeśli okno nie sprawiają, że na ekranie można zyskać trochę większą kontrolę nad przepływem ...

Mniejszy problem jest pan teraz będzie musiał przekazać dialogowe pracownikowi więc może przejąć kontrolę nad nim ...

public class TestSwingWorkerDialog { 

    public static void main(String[] args) { 
     new TestSwingWorkerDialog(); 
    } 
    private JDialog dialog; 

    public TestSwingWorkerDialog() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       MyWorker worker = new MyWorker(); 
       worker.execute(); 

      } 
     }); 
    } 

    public class MyWorker extends SwingWorker<Object, Object> { 

     @Override 
     protected Object doInBackground() throws Exception { 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        getDialog().setVisible(true); 
       } 
      }); 
      Thread.sleep(2000); 

      return null; 
     } 

     @Override 
     protected void done() { 
      System.out.println("now in done..."); 
      JDialog dialog = getDialog(); 
      // Don't care, dismiss the dialog 
      dialog.setVisible(false); 
     } 

    } 

    protected JDialog getDialog() { 
     if (dialog == null) { 

      dialog = new JDialog(); 
      dialog.setModal(true); 
      dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
      dialog.setLayout(new BorderLayout()); 
      dialog.add(new JLabel("Please wait...")); 
      dialog.setSize(200, 200); 
      dialog.setLocationRelativeTo(null); 

     } 

     return dialog; 
    } 

} 
+1

Jaka jest różnica między 'SwingUtilities.invokeLater' a' EventQueue.invokeLater'? – Mordechai

+1

Przepraszam, jeśli moje pytanie jest głupie, ale w twoim przykładzie jest to zagwarantowane, że metoda invokeLater's run jest z pewnością uruchamiana przed zakończeniem pracy()? Wydaje mi się, że głównym problemem moich postów pozostaje - niepewna teoretycznie współbieżność, ale mogę się mylić. – user1713059

+2

@ M.M. Nie ma żadnych. SwingUtilities.invokeLater przekazuje połączenie do EventQueue.invokeLater. –

Powiązane problemy