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?
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);
No właśnie jak robie to w ten sposób to przy zamykaniu tego drugiego okna zamyka się cała aplikacja.
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);
}
}
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.
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);
}
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?
javax.swing.WindowConstants.EXIT_ON_CLOSE
=
javax.swing.WindowConstants.DISPOSE_ON_CLSOE
@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>.
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?
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();
}
}
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