On click, How to close only one Frame not both or whole application?
(I have also tried with AWT Event dispatch, EDT)
package test;
import java.awt.*;
import java.awt.AWTEvent;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.*;
import java.lang.reflect.InvocationTargetException;
public class Test11 extends Frame implements MouseListener
{
public static Frame gp;
public Test11()
{
try {
this.setLayout (new BorderLayout ());
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
this.setBounds(screen.width-400,33,400, 400);
this.setBackground(Color.red);
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
this.addMouseListener(this);
this.setVisible(true);
} finally {
}
}
/* How do i do AWT Event Dispatch (EDT): to cloase AWT window? */
public static void main(String[] args) throws InterruptedException, InvocationTargetException
{
/* EDT: AWT Event Dispatch
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.push(new MyEventQueue()); */
/* Simple close */
EventQueue.invokeAndWait(new Runnable()
{
public void run()
{
System.out.println("Run: Window 1");
gp = new Test11();
gp.setVisible(true);
//gp.setVisible(false);
}
});
/* Simple close */
EventQueue.invokeAndWait(new Runnable()
{
public void run()
{
System.out.println("Run: Window 2");
new Test11().setVisible(true);
}
});
}
@Override
public void mouseClicked(MouseEvent me)
{
System.out.println("Clicked: out of Window1 or Window2, close only any one not whole application");
System.exit(0);
}
@Override
public void mousePressed(MouseEvent me) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void mouseReleased(MouseEvent me) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void mouseEntered(MouseEvent me) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void mouseExited(MouseEvent me) {
throw new UnsupportedOperationException("Not supported yet.");
}
/* EDT: Extended class
private static class MyEventQueue extends EventQueue
{
public void postEvent(AWTEvent theEvent)
{
System.out.println("Event Posted");
super.postEvent(theEvent);
}
}
*/
}
Follow up:
import java.awt.*;
import java.awt.event.*;
public class Test11 extends Frame
{
public static Frame window1;
public static Frame window2;
public Test11(String title) {
super(title);
setSize(400, 400);
setBackground(Color.red);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.out.println(
getTitle() +
" says Bye-Bye! " +
new java.util.Date());
dispose();
}
});
setLocationByPlatform(true);
}
public static void main(String[] args) {
/* AFAIU starting the GUI on the EDT only applies to Swing.*/
EventQueue.invokeLater(new Runnable() {
public void run() {
System.out.println("Run: Window 1");
window1 = new Test11("Window 1");
window1.setVisible(true);
System.out.println("Run: Window 2");
window2 = new Test11("Window 2");
window2.setVisible(true);
}
});
/* Remotely: i need to close thi window, not manually */
window2.setVisible(false);
/* failed then try */
window2.dispose();
/* Now: I should have only Window1, but that i am not able to make yet */
}
}
Typical Output
Update 1
This code closes “Window 2” programatically. The problem with your version was ‘timing’, caused by the call to invoke later (what do you think that means?). It can be fixed in one of two relatively easy ways.
Timer/ActionListenerset to go off 2 seconds after the main runs. For that route, take out the ‘comment part’ of all the commented code lines in the main.EventQueue.invokeLater(), which is irrelevant to AWT components.Here is the altered code: