Swing - ponowne otworzenie okna

Swing - ponowne otworzenie okna
SW
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 7 lat
  • Postów:30
0

Słuchajcie mam pewien problem.
Mam aplikacje, napisaną z wykorzystaniem swinga, która składa się z 3 JFrame'ów.

Główny widok jest powiązany z metodą main, która wygląda jak poniżej

Kopiuj
public class Main {
public static void main(String[] args) {
    Form form = new Form();

    checkIfRunning();
} 

widok główny - form
user image

form ma zdefiniowane dwa buttony, gdzie każdy z nich wywołuje nowego jFrame'a, ale w przypadku kiedy obecnie nie jest utworzony obiekt tej klasy.
Poniżej listener jednego z przycisków.

Kopiuj
 newDoctorButton.addActionListener(new ActionListener() {
        private NDoctor dc = null;
        @Override
        public void actionPerformed(ActionEvent e) {
            if (dc == null){
                dc = new NDoctor();}
            else dc.toFront();
        }
    });

Wszystko działa poprawnie, jednak jeśli wyłączę okno i będę chciał je uruchomić ponownie to nic się nie dzieje. Domyślam się, że problem leży w tym, że główne okno budowane jest za pomocą metody main, gdzie tworzony jest widok główny.
Powyższy listener uruchomi się jedynie raz, chyba, że ponownie wywołam metodę main, ale to sprawi ponowne utworzenie głównego widoku, a nie o to chodzi.

R1
  • Rejestracja:około 10 lat
  • Ostatnio:około 5 lat
  • Postów:208
1

bez kodu nikt nie jest jasnowidzem. Kolejna sprawa

Kopiuj
dc.toFront

nie ujawni okna "zamkniętego". Może lepiej dc.setVisible(true)

Kopiuj
bogdans
Na pewno lepiej.
SW
zamiar tego if'a był taki, że utworzy obiekt, w momencie kiedy nie istnieje, a kiedy jest już utworzony- otwarty a kliknę na button ponownie, to przesunie okno na wierzch.
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

Jak napisał @rafal20-1988, użyj

Kopiuj
dc.setVisible(true);

Ponadto w klasie NDoctor ustaw
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

Kopiuj

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
R1
  • Rejestracja:około 10 lat
  • Ostatnio:około 5 lat
  • Postów:208
1

no dobra ale **toFront **przesuwa na wierz okno które istnieje na ekranie a nie zamknięte okno

SW
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 7 lat
  • Postów:30
0

Panowie, macie racje ! aż mi głupio, że w tym tkwił błąd, nigdy bym nie przypuszczał, że tu leży pies pogrzebany ;)
Ja inaczej rozumiałem tego if'a mianowicie w pierwszej kolejności jest sprawdzane czy okno jest otwarte, jeśli nie to tworzony jest obiekt NDoctor.
Jeśli obiekt już istnieje, a ja kliknę w button, to przesunie mi na wierzch okno, które zostało wcześniej otwarte. Jeszcze raz sobie to prześledzę, dzięki ;)

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

Weź jeszcze po uwagę, że jeśli nie blokujesz przycisku po jego kliknięciu

Kopiuj
newDoctorButton.setEnabled(false);

to może się zdarzyć, że użytkownik klika w momencie gdy okno nowego doktora jest widoczne, ale zminimalizowane.setVisible(true);

Kopiuj
nie powiększy okna. 
Proponuję taki kod:
```java
        public void actionPerformed(ActionEvent e) {
            if (dc == null){
                dc = new NDoctor();}
            else if(dc.isVisible){
                dc.setExtendedState(NORMAL);
            }
            else{
                dc.setVisible(true);
            }
        }

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
SW
Wielkie dzięki, nie wziąłem tego pod uwagę ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.