我正在使用以下方法来显示框架:
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();
}
我可以看到日志消息,但是虚拟机仍在运行。我也想终止它。我做错了什么?
似乎仍在运行一个非守护线程,但我不明白为什么:
最佳答案
您没有设置 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/