mho*_*r38 10 java swing jfilechooser interrupted-exception
以下代码的输出是:
java.vendor Sun Microsystems Inc.
java.version 1.6.0_26
java.runtime.version 1.6.0_26-b03
sun.arch.data.model 32
os.name Windows XP
os.version 5.1
os.arch x86
Input selection cancelled by user.
Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at sun.java2d.Disposer.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
以下代码显示了我的计算机上的异常.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUI extends JPanel implements ActionListener {
private final String newline = System.getProperty("line.separator");
JButton openButton;
JTextArea log;
JFileChooser fc;
public GUI() {
super(new BorderLayout());
log = new JTextArea(20,40);
log.setMargin(new Insets(5,5,5,5));
log.setEditable(false);
fc = new JFileChooser();
openButton = new JButton("Open");
openButton.addActionListener(this);
JPanel buttonPanel = new JPanel(); //use FlowLayout
buttonPanel.add(openButton);
add(buttonPanel, BorderLayout.NORTH);
add(new JScrollPane(log));
showProp("java.vendor");
showProp("java.version");
showProp("java.runtime.version");
showProp("sun.arch.data.model");
showProp("os.name");
showProp("os.version");
showProp("os.arch");
}
public void showProp(String name) {
output(name + " \t" + System.getProperty(name));
}
public void output(String msg) {
log.append(msg + newline);
log.setCaretPosition(log.getDocument().getLength());
System.out.println(msg);
}
public void actionPerformed(ActionEvent e) {
//Handle open button action.
int returnVal = fc.showOpenDialog(GUI.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
//This is where a real application would open the file.
output(
"Input File Selected: " +
fc.getSelectedFile().getName() +
".");
} else {
output("Input selection cancelled by user.");
}
log.setCaretPosition(log.getDocument().getLength());
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event dispatch thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("IDE Output Converter");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add content to the window.
frame.add(new GUI());
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,主窗口打开正常,程序运行正常.
但是,如果你:
JFileChooser
使用"打开文件"按钮一个InterruptedException
被抛出.或者,如果您选择一个文件并"打开"它然后退出程序,则会抛出相同的错误.在这个博客上同样的事情是用示例代码解释的,他的解决方案是尽快调用new JFileChooser();
,这对我没有任何影响.
这是1.6.0_26中的错误吗?如果是这样,该版本是否有解决方法?
这是代码吗?如果是这样,如何解决?(看起来不太可能,另外两个空结果 - 其中一个现在被删除了.)
Ing*_*gel 12
我会说这是一个小错误sun.awt.Disposer
.
该类创建"Java2D Disposer"守护程序线程,该线程处理处理垃圾收集对象(主要是AWT窗口)的AWT资源.大多数情况下,线程在其引用队列上等待新的一次性对象被垃圾收集.当线程被中断时,它会显式地打印该异常.
当JVM终止时,它会中断所有线程.在某些情况下 - 显然受到JFileChooser的使用和由它初始化的子系统的影响 - 一些线程仍然有机会在这次中断后运行.在这种情况下InterruptedException
,在"Java2D Disposer"线程中抛出了一个,因为它正在等待锁定.如果在关机期间忽略该异常会更好.
作为解决方法,替换
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Run Code Online (Sandbox Code Playgroud)
同
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
PrintStream nullStream = new PrintStream(new OutputStream() {
public void write(int b) throws IOException {
}
public void write(byte b[]) throws IOException {
}
public void write(byte b[], int off, int len) throws IOException {
}
});
System.setErr(nullStream);
System.setOut(nullStream);
System.exit(0);
}
});
Run Code Online (Sandbox Code Playgroud)