java使用AWT关闭一个框架(而不是整个应用程序)
单击后,如何仅关闭一个Frame
而不是同时关闭两个或整个应用程序?
(我也尝试过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);
}
}
*/
}
跟进:
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 */
}
}
# 1 楼答案
最简单的方法是使用:
如果放置在onClickListener中,则只需关闭与文件关联的窗口。这不会终止整个程序
# 2 楼答案
典型输出
更新1
此代码以编程方式关闭“窗口2”。您的版本出现了“计时”问题,这是由稍后调用引起的(您认为这是什么意思?)。它可以用两种相对简单的方法之一进行修复
Timer
/ActionListener
设置,使其在主运行后2秒关闭。对于该路由,去掉main中所有注释代码行的“注释部分”李>EventQueue.invokeLater()
的调用,这与AWT组件无关李>这是修改后的代码:
# 3 楼答案
在设计模式下,您必须使用右clic转到jframe的属性并选择: 在defaultcloseoperation行中处理(通常是第一行)
所有这些操作在设计上都比较容易。 我说的是netbeans,但我希望它在另一个ide中也类似
# 4 楼答案
看看setDefaultCloseOperation():
HIDE_ON_CLOSE
是该行为的正确属性,这些方法对Swing有效编辑:
如果要重用此/这些容器,则