start a new JFrame from an existing one, and when old JFrame closes new one does not

J

jakester

I have the need to create a new JFrame from an existing one. The code
below show how I am accomplishing this task. However, when the
original JFrame closes, all JFrames created from the original JFrame
closes. Could someone please help me how to create a new JFrame so
that it runs outside the thread of the original? Thanks.

public class MyGuiForm extends JFrame implements ActionListener {

private JButton _btnNew;

public MyGuiForm() {
_btnNew = new JButton("New");
_btnNew.addActionListener(this);

this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(_btnNew);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.show();
}

public void actionPerformed(ActionEvent ae) {
Object source = ae.getSource();
if(null == source) return;

if(_btnNew == source) {
new MyGuiForm();
}
}

/**
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
new MyGuiForm();
}
});
}
}
 
K

Knute Johnson

jakester said:
I have the need to create a new JFrame from an existing one. The code
below show how I am accomplishing this task. However, when the
original JFrame closes, all JFrames created from the original JFrame
closes. Could someone please help me how to create a new JFrame so
that it runs outside the thread of the original? Thanks.

public class MyGuiForm extends JFrame implements ActionListener {

private JButton _btnNew;

public MyGuiForm() {
_btnNew = new JButton("New");
_btnNew.addActionListener(this);

this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(_btnNew);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.show();
}

public void actionPerformed(ActionEvent ae) {
Object source = ae.getSource();
if(null == source) return;

if(_btnNew == source) {
new MyGuiForm();
}
}

/**
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
new MyGuiForm();
}
});
}
}

Your code is very difficult to read without any indentation.

You tell your program to exit when this frame is closed with this line:
> this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Take that line out and it won't do that any more. Also you don't need
all of the 'this.' in front of methods that are part of 'this'.
 
S

SadRed

I have the need to create a new JFrame from an existing one. The code
below show how I am accomplishing this task. However, when the
original JFrame closes, all JFrames created from the original JFrame
closes. Could someone please help me how to create a new JFrame so
that it runs outside the thread of the original? Thanks.

public class MyGuiForm extends JFrame implements ActionListener {

private JButton _btnNew;

public MyGuiForm() {
_btnNew = new JButton("New");
_btnNew.addActionListener(this);

this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(_btnNew);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.show();

}

public void actionPerformed(ActionEvent ae) {
Object source = ae.getSource();
if(null == source) return;

if(_btnNew == source) {
new MyGuiForm();

}
}

/**
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
new MyGuiForm();

}
});
}
}
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Use other value. See API doc.
 
J

jakester

If I comment out the code
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); then I get the
intended behaviour. The problem is now the java thread does not
terminate.

I looked at the JavaDocs for the options on setDefaultCloseOperation
and it turns out JFrame.DISPOSE_ON_CLOSE would probably help me out.
So I uncommented the line above and did
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); and everything
works!

Thank you both.

jakester said:
I have the need to create a new JFrame from an existing one. The code
below show how I am accomplishing this task. However, when the
original JFrame closes, all JFrames created from the original JFrame
closes. Could someone please help me how to create a new JFrame so
that it runs outside the thread of the original? Thanks.
public class MyGuiForm extends JFrame implements ActionListener {
private JButton _btnNew;
public MyGuiForm() {
_btnNew = new JButton("New");
_btnNew.addActionListener(this);
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(_btnNew);

public void actionPerformed(ActionEvent ae) {
Object source = ae.getSource();
if(null == source) return;
if(_btnNew == source) {
new MyGuiForm();
}
}
/**
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
new MyGuiForm();
}
});
}
}

Your code is very difficult to read without any indentation.

You tell your program to exit when this frame is closed with this line:
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Take that line out and it won't do that any more. Also you don't need
all of the 'this.' in front of methods that are part of 'this'.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,731
Messages
2,569,432
Members
44,834
Latest member
BuyCannaLabsCBD

Latest Threads

Top