我有一个作业,将JFileChooser显示为JFrame的一部分。因此将其显示为对话框即可。
我正在做最基本的方法,将它作为一个组件添加到一个不可见的帧,然后setVisible()
调用冻结而不是显示帧。
最让我感到震惊的是,在FileChooser出现的情况下,框架中出现了十次。这让我觉得这是一个并发问题。
这是仍有问题的最小源代码。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
class ApplicationFrame extends JFrame {
JFileChooser fileChooser;
public ApplicationFrame(String frameName) {
super(frameName);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
fileChooser = new JFileChooser();
fileChooser.setControlButtonsAreShown(false);
panel.add(fileChooser, BorderLayout.CENTER);
getContentPane().add(panel);
}
}
public class lab7{
public static void main(String args[])
{
ApplicationFrame windowForApplication = new ApplicationFrame("lab7");
windowForApplication.setSize(600,600);
windowForApplication.setVisible(true);
}
}
如果您在最终setVisible
之后放置了println,则不会调用它。
如果您注释掉panel.add()
,则框架显示正常。
我还应该做些什么才能显示文件选择器?
答案 0 :(得分:4)
最让我感到震惊的是,在FileChooser出现的情况下,框架中出现了十次。
应在Event Dispatch Thread上创建所有Swing组件。因此,GUI创建代码应该包含在SwingUtilities.invokeLater(...)
中。
阅读Concurrency上Swing教程中的部分,了解更多信息以及如何完成此操作的示例。
您的代码(按原样)实际上对我没有问题。我在Windows 7上使用JDK7,因此可能是版本/平台问题。再次确保代码在EDT上执行。
此外,类名(“lab7”)应以大写字母开头。如果这是一个SSCCE无关紧要,请保持一致。