Close one frame (not the whole application) using AWT

In a click, How to close only one Frame not both or the whole application? (I also tried sending events with AWT, 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); } } */ } 

Following actions:

 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 */ } } 
+4
source share
4 answers
 import java.awt.*; import java.awt.event.*; public class Test11 extends Frame { 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"); (new Test11("Window 1")).setVisible(true); System.out.println("Run: Window 2"); (new Test11("Window 2")).setVisible(true); } }); } } 

Typical output

 Run: Window 1 Run: Window 2 Window 1 says Bye-Bye! Mon Nov 14 10:20:25 EST 2011 Window 2 says Bye-Bye! Mon Nov 14 10:20:35 EST 2011 Press any key to continue . . . 

Update 1

This code programmatically closes "Window 2". The problem with your version was the "time" caused by the call to call later (what do you think it means?). It can be fixed in one of two relatively simple ways.

  • Cold Add the Swing Timer / ActionListener set to 2 seconds after the main runs. For this route, output the "comment part" of all lines of the comment code in the main one.
  • The best solution. Remove the call to EventQueue.invokeLater() , which is not related to AWT components.

Here is the modified code:

 import java.awt.*; import java.awt.event.*; // since the OP has not taken the time to explain 'why AWT', // I choose to make life easy by using a Swing class. import javax.swing.Timer; 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); // } //}); //ActionListener closeWindow = new ActionListener(){ // public void actionPerformed(ActionEvent ae) { System.out.println( window2.getTitle() + " says Bye-Bye! " + new java.util.Date()); /* failed then try */ window2.dispose(); // } //}; //Timer timer = new Timer(2000,closeWindow); //timer.setRepeats(false); //timer.start(); } } 
+5
source

See setDefaultCloseOperation () : HIDE_ON_CLOSE is the correct attribute for this behavior, these methods are valid for Swing,

EDIT:

if you want to reuse this / these container (s) then

 this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { this.setVisible(false); } }); 
+3
source

The easiest way to do this is to use:

 dispose(); 

This simply closes the window associated with the file if it is placed inside the onClickListener. This does not complete the entire program.

+2
source

in design mode, you need to go to the jframe properties with a right click and select: DELETE in the defaultcloseoperation line (usually this is the first line).

this whole operation is easier to design. I am talking about netbeans, but I hope this looks like a different ideal.

0
source

Source: https://habr.com/ru/post/1381043/