JFrame中的JFileChooser使setVisible()冻结

Leo*_*sov 1 java swing jfilechooser jframe

我有一项作业要显示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);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果将println放在final后面setVisible,则不会调用它。

如果您将其注释掉panel.add(),则框架将显示得很好。

我还应该怎么做才能显示文件选择器?

cam*_*ckr 5

最让我讨厌的是,在十分之一的时间里,出现了FileChooser就很好了。

所有Swing组件都应在事件调度线程上创建。因此,GUI创建代码应包装在中SwingUtilities.invokeLater(...)

阅读Swing 并发教程中的这一节,以获取更多信息以及如何完成此操作的示例。

您的代码(按原样)实际上对我来说没有问题。我在Windows 7上使用JDK7,因此可能是版本/平台问题。再次确保代码在EDT上执行。

同样,类名(“ lab7”)应以大写字母开头。不论是否为SSCCE,都应保持一致。