2011-05-04 7 views
8

Mam problem z moją aplikacją, w której użytkownik otworzy więcej niż jedno okno na raz. I dodałem metodę dispose() do wywołania przy zamykaniu okna. Teraz powinienem trzymać przy-przynajmniej jedno okno otwarte przez cały czas, aby aplikacja nie ukrywała się bez pełnego zamknięcia. Jeśli nie rozumiesz, przeczytaj następujący scenariusz:Jak znaleźć, jeśli okno jest otwarte na huśtawce

Mam otwarte okno A i okno B w tym samym czasie. Teraz mogę zamknąć albo okno A, albo okno B, ale nie oba. Innymi słowy, okno B powinno być dozwolone tylko wtedy, gdy okno A jest otwarte i na odwrót. Jak to zrobić w zamachu?

Odpowiedz

14

Prosty rodzaj-of windowManger naprawdę nie jest trudne, wystarczy mieć

  • WindowListener który zachowuje ślady Windows ona słucha
  • z określonym miejscu, aby utworzyć okna i zarejestrować słuchacza
  • sprawiają, że okna nie robić nic na blisko słuchacza i uczynić odpowiedzialnym za decyzję, czy zamknąć, czy nie (będzie to zrobić dla wszystkich z wyjątkiem ostatniego)

Niektóre urywek:

// the listener (aka: WindowManager) 
    WindowListener l = new WindowAdapter() { 
     List<Window> windows = new ArrayList<Window>(); 

     @Override 
     public void windowOpened(WindowEvent e) { 
      windows.add(e.getWindow()); 
     } 

     @Override 
     public void windowClosing(WindowEvent e) { 
      if (windows.size() > 1) { 
       windows.remove(e.getWindow()); 
       e.getWindow().dispose(); 
      } 
     } 
    }; 
    // create the first frame 
    JFrame frame = createFrame(l); 
    frame.setVisible(true); 


// a method to create a new window, config and add the listener 
    int counter = 0; 
    private JFrame createFrame(final WindowListener l) { 
     Action action = new AbstractAction("open new frame: " + counter) { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JFrame frame = createFrame(l); 
       frame.setVisible(true); 

      } 
     }; 
     JFrame frame = new JFrame("someFrame " + counter++); 
     frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
     frame.add(new JButton(action)); 
     frame.addWindowListener(l); 
     frame.pack(); 
     frame.setLocation(counter * 20, counter * 10); 
     return frame; 
    } 
+0

+1 dla ['Action'] (http://download.oracle.com/javase/tutorial/uiswing/misc/action.html). – trashgod

+0

+1 bardzo ładny kawałek kodu. – Boro

+0

+1 nigdy nie pomyślał o takim pomyśle. :) –

4

Tylko możliwe podejście ...

Utwórz klasę, nazwać WindowManager, który zarządza tworzenia i usuwania okien.

To może na przykład utrzymać liczbę okien aktualnie otwartych i umożliwić działanie rozporządzać tylko wtedy, gdy istnieje więcej niż jeden okna „żywy”, w przeciwnym razie pokazać komunikat potwierdzenia z JOptionPane informując użytkownika „naprawdę blisko? To by zakończyło aplikację. " czy coś takiego.

Część "podchwytliwa" polega na tym, że musisz wykonać tego rodzaju operacje związane z oknem w całym numerze WindowManager, w przeciwnym razie wszystko by się zepsuło.

Nie wiem, czy Swing ma coś takiego w tym wbudowanym, nigdy nie widziałem takiego scenariusza.

+0

'W„trudne”jest to, że trzeba robić żadnych operacji związanych z okna-całym managerem okien, inaczej wszystko by wkręcić up.' Co masz na myśli przez to? Zrozumiałem, że operacje związane z okienkiem to otwieranie i zamykanie. Czy muszę się martwić o zmianę rozmiaru, przenoszenie itp? – Deepak

+0

Nie, po prostu wskazywałem na fakt, że gdy użytkownik kliknie przycisk "x" okna, musisz obsłużyć to z poziomu klasy okna, a następnie przekazać do 'WindowManager' faktyczną logikę operacji . Jest to nieco trudne, ale działa. Co więcej, kiedy trzeba stworzyć nowe, musi to zrobić menedżer lub przynajmniej powiadomiony menedżera. Trochę nudne. [edytował odpowiedź] – gd1

+1

Pozwól mi zobaczyć, czy mogę znaleźć jakieś wbudowane funkcje ... jeśli nie ma innych, powinienem wdrożyć twój pomysł .. Powiadom mnie, jeśli znajdziesz coś stosunkowo łatwiejsze .. dzięki! – Deepak

1

po prostu sprawdź, czy inne okno jest otwarte przed zamknięciem za pomocą window.isVisible();

Powiązane problemy