Dodawanie nowego okna do projektu

0

Witam,
Problem na pewno jest trywialny ale jakoś nie mogę sobie z nim poradzić: W jaki sposób do aplikacji okienkowej dodać drugie okno w taki sposób, aby po zamknięciu tego nowego okna nie zamykała się cała aplikacja?

0

Okno to obiekt klasy JFrame (Frame) ?

public class BlaBla extends JFrame
...
BlaBla noweOkno=new BlaBla();
noweOkno.setVisible(true);

i w konstruktorze klasy BlaBla nie umieszczasz

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
0

No właśnie jak robie to w ten sposób to przy zamykaniu tego drugiego okna zamyka się cała aplikacja.

0

Niemożliwe. Kiedy pokazujesz drugie okno, to pierwsze jest też widoczne ?
P.S. Zamknięcie wszystkich okien, to nie to samo co zamknięcie aplikacji.
Aby pokazać pierwsze okno po zamknięciu drugiego możesz postąpić tak:

//w konstruktorze drugiego okna
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new Otwieracz());
.....
class Otwieracz extends WindowAdapter
{
    public void windowClosing(WindowEvent e)
    {
        drugieOkno.setVisible(false);
        pierwszeOkno.setVisible(true);
    }
}
0

nowa klasa wygląda tak:

package j2ee;

public class Nowy extends javax.swing.JFrame {

    /** Creates new form Nowy */
    public Nowy() {
        initComponents();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    }
    @SuppressWarnings("unchecked")
}

a jej wywołanie wygląda tak:

Nowy okienko = new Nowy();
okienko.setVisible(true);

wygląda to tak że moja aplikacja ma jedno główne okno, po kliknięciu na pewnym komponencie otwiera się nowe okno. Ale po jego zamknięciu tego nowego okna, zamyka się cała aplikacja.

0

OMG, przecież napisałem

i w konstruktorze klasy BlaBla nie umieszczasz
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

a u Ciebie jest

public Nowy() {
initComponents();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
}

0

Faktycznie - nie zauważyłem tego. Mam jeszcze jedno pytanie: czy w jakiś sposób główne okno mojej aplikacji może "dowiedzieć się" o zamknięciu tego okna pomocniczego?

0

javax.swing.WindowConstants.EXIT_ON_CLOSE

=

javax.swing.WindowConstants.DISPOSE_ON_CLSOE

0

@gosc, napisał

javax.swing.WindowConstants.EXIT_ON_CLOSE

=

javax.swing.WindowConstants.DISPOSE_ON_CLSOE

Nie wprowadzaj ludzi w błąd,
javax.swing.WindowConstants.EXIT_ON_CLOSE != javax.swing.WindowConstants.DISPOSE_ON_CLOSE
Fragment dokumentacji

static final int DISPOSE_ON_CLOSE

....

Note: When the <b>last</b> displayable window within the Java virtual machine (VM) is disposed of, the VM <b>may terminate</b>.
0

ISPOSE_ON_CLSOE było tym czego szukałem.
Ponawiam jednak pytanie: Czy jest jakiś sposób aby okno główne "wiedziało" co dzieje się z tym drugim oknem, np. żeby po jego zamknięciu w oknie głównym wykonał się pewien ciąg instrukcji?

0

Tylko Ci się wydaje, że DISPOSE_ON_CLOSE jest tym czego szukałeś. Często jest tak, że drugie okno jest wielokrotnie otwierane i zamykane. Jeżeli zrobisz DISPOSE_ON_CLOSE, to aby ponownie pokazać drugie okno musisz je znów konstruować, w szczególności tracisz wszystkie zmiany w oknie (np. wpisane wartości do pól tekstowych), które wprowadził użytkownik. Jeśli nie chcesz ich tracić, to lepsze jest HIDE_ON_CLOSE.
Dla klasy JFrame domyślne jest HIDE_ON_CLOSE, dla klasy Frame z AWT domyślne (i jedynie możliwe) jest DO_NOTHING_ON_CLOSE.
Jak poinformować główne okno, że drugie zostało zamknięte ? Jedna z możliwości jest taka, konstruując drugie okno przekazujesz referencję do okna głównego.

//w głównym oknie
Nowy n=new Nowy(this);
n.setVisible(true);
........
public class Nowy extends javax.swing.JFrame 
{
    GlowneOkno  parent;  
    public Nowy(GlowneOkno p) 
    {
        this.parent=p;
        initComponents();
        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                zakoncz();
            }
        });
    }
.....
    private void zakoncz()
    {
        parent.doSomething();
        setVisible(false);
        //lub (jeżeli okno nie będzie Ci potrzebne)
        dispose();
    }
}
0

2 sposoby :

1 )
W glownym oknie twozysz watek
w metodzie "watkowej" robisz cos takiego
while( twojedrugieokno.Enabled() ) {}

2 )
jak wyzej czyli przesylasz cala klase z oknem glownym do klasy drugiego okna i wywyolujesz tam jakas metode

1 użytkowników online, w tym zalogowanych: 0, gości: 1