【问题标题】:How to I terminate a swing GUI programmatically?如何以编程方式终止摆动 GUI?
【发布时间】:2014-02-28 02:56:26
【问题描述】:

试图终止一个 swing gui,启动同一个 gui 并终止它。

我正在使用question 的答案,但它似乎只能工作一次。

下面的代码循环一次并在打印 2 后挂起。

import java.awt.Toolkit;
import java.awt.event.WindowEvent;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;
public class Hello {
    void createAndShowGUI() {
        frame=new JFrame("HelloWorldSwing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel label=new JLabel("Hello World");
        frame.getContentPane().add(label);
        frame.pack();
        frame.setVisible(true);
    }
    void goodbye() {
        WindowEvent wev=new WindowEvent(frame,WindowEvent.WINDOW_CLOSING);
        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
    }
    static void helloGoodbye() throws InterruptedException,InvocationTargetException {
        System.out.println("enter");
        final Hello hello=new Hello();
        System.out.println("1");
        javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                System.out.println("3");
                hello.createAndShowGUI();
                System.out.println("4");
            }
            {
                System.out.println("2");
            }
        });
        System.out.println("5");
        SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                hello.goodbye();
                System.out.println("6");
            }
        });
        // Thread.sleep(1000);
        System.out.println("exit");
    }
    public static void main(String[] args) throws InvocationTargetException,InterruptedException {
        for(int i=0;i<10;i++)
            helloGoodbye();
        System.out.println("exiting main");
    }
    JFrame frame;
}

为什么它不起作用?

【问题讨论】:

  • Chit,您的代码甚至无法编译。但同样重要的是,你的目标是什么。根据您的问题,您听起来好像要重复启动、停止、然后启动和停止 Swing GUI?为什么?您的 UI 体验是什么?
  • 它在 Eclipse 中编译得很好。我使用的是 jdk 8。我将添加一个决赛。每次调用都会将 gui 的图片保存在文件中。
  • 您的 Hello 变量声明中缺少 final 访问修饰符,所以不,它不应该编译。
  • @BobbyDigital:你迟到了大约 10 分钟。我们已经从这个转向更大更好的问题。现在至少我正在试图弄清楚 OP 到底在做什么,他们真正的问题是什么。
  • @BobbyDigital:我踩到了神经。我也很抱歉。

标签: java swing jframe terminate


【解决方案1】:

程序没有挂起而是退出,因为:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

来自the doc

EXIT_ON_CLOSE(在 JFrame 中定义):使用系统退出方法退出应用程序。仅在应用程序中使用。

在这里,DISPOSE_ON_CLOSE 似乎会导致您期望的行为。当您可以致电setVisible(false)dispose 时,我也没有真正看到发布此窗口关闭事件的理由。如果不对程序的实际意图做任何假设,这两个选项都会导致所有 10 帧都被显示/隐藏/处理。

我猜程序在打印 '2' 后停止的原因是调用 invokeAndWait 会导致任何先前排队的事件被抽出,包括窗口关闭事件。

【讨论】:

  • 就像魅力一样。我不知道他正在调用system.exit!谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-10-21
  • 2022-11-12
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 2015-05-14
相关资源
最近更新 更多