java - 为什么我的相框没有被处理掉?

标签 java swing

我正在使用以下方法来显示框架:

public static void createImage(final String url, final String file, final String filetype) {
        UIUtils.setPreferredLookAndFeel();
        NativeInterface.open();
        SwingUtilities.invokeLater(new Runnable() {

            @SuppressWarnings("deprecation")
            @Override
            public void run() {

                frame = new JFrame();
                WebsiteThumbnailCreator ex = new WebsiteThumbnailCreator(url, file, filetype);

                frame.getContentPane().add(ex, BorderLayout.CENTER);
                frame.setSize(FRAMESIZE);
                frame.setLocationByPlatform(true);
                frame.setVisible(true);
                frame.hide();
            }

        });

        NativeInterface.runEventPump(); 
  }

然后我做了一些计算,然后我想再次处理框架:

try {
   ImageIO.write(rendered, filetype, new File(file + "." + filetype));
   frame.dispose();
   logger.trace("Tried to dispose the frame");
} catch (IOException e) {
   logger.fatal(e.getMessage());
} finally {
    logger.debug("Try to dispose the frame");
    frame.dispose();
}

我可以看到日志消息,但是虚拟机仍在运行。我也想终止它。我做错了什么?

似乎仍在运行一个非守护线程,但我不明白为什么:

enter image description here

最佳答案

您没有设置 JFrame 的默认关闭操作,它默认为 JFrame.HIDE_ON_CLOSE

添加到您的 JFrame 设置代码:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

如果您的 JFrame 是您的应用程序并且您想在 JFrame 关闭时退出所有内容,或者

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

如果您的 JFrame 不是整个应用程序并且您想停止 Swing 线程但继续处理。

有关这方面的更多信息,请查看 JFrame API

编辑:
关于您的评论,

@HovercraftFullOfEels okay if what you say is right why is my frame disappearing in this code: public static void frameTest() throws InterruptedException { final JFrame jf = new JFrame("Hello World"); jf.setBounds(100, 100, 400, 400); jf.setVisible(true); Thread.sleep(8000); SwingUtilities.invokeLater(new Runnable() { public void run() { // TODO Auto-generated method stub jf.dispose(); } }); }

我翻译成:

public static void frameTest() throws InterruptedException {
  final JFrame jf = new JFrame("Hello World");
  jf.setBounds(100, 100, 400, 400);
  jf.setVisible(true);
  Thread.sleep(8000);
  SwingUtilities.invokeLater(new Runnable() {
     public void run() {
        jf.dispose();
     }
  });
}

只有在没有更多非守护线程剩余时才会退出。如果你给它一个非守护线程,它会一直运行。例如,

public static void main(String[] args) {
  new Thread(new Runnable() {
     public void run() {
        for (int i = 0; i < 30; i++) {
           System.out.println("i := " + i);
           try {
              Thread.sleep(1000);
           } catch (InterruptedException e) {
              e.printStackTrace();
           }
        }
     }
  }).start();
  try {
     frameTest();
  } catch (InterruptedException e) {
     e.printStackTrace();
  }
}

您的代码将在此示例中继续运行。

关于java - 为什么我的相框没有被处理掉?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10421764/

相关文章:

java - 使用变量指定R对象

java - install4j:如何在版本8上创建跨平台jre包?

java - 为什么此代码不会在底部显示三个按钮的滚动 Pane 内显示内容

java - Swing GUI 中 validate()、revalidate() 和 invalidate() 之间的区别

java - 如何使用计时器显示和隐藏 Swing 中的图像?

java - neo4J java查询参数

java - 使用 Transformer 将实体映射到 DTO 时获取实体内的集合

java - 嵌套异常是 java.lang.LinkageError : org/springframework/transaction/interceptor/TransactionInterceptor

java - 获取 Runnable 的当前实例

java - 如何更新放入 JTextField 的文件中的行