java - JFrame 中的 JFileChooser 使 setVisible() 卡住

标签 java swing jframe jfilechooser

我的任务是将 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(),框架会正常显示。

我还应该做什么来显示文件选择器?

最佳答案

What irks me the most is that one time out of ten the frame appears with the FileChooser just fine.

所有 Swing 组件都应该在 Event Dispatch Thread 上创建。因此,GUI 创建代码应该包装在 SwingUtilities.invokeLater(...) 中。

阅读 Concurrency 上的 Swing 教程部分获取更多信息以及如何完成此操作的示例。

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

另外,类名(“lab7”)应该以大写字符开头。这是否是 SSCCE 并不重要,请保持一致。

关于java - JFrame 中的 JFileChooser 使 setVisible() 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29151013/

相关文章:

java - 当 Class 扩展 JFrame 时,httpunit 不起作用

java - 不推荐在没有设置文件的情况下执行 Gradle : How to write a setting file and where to save

java - 如何使用 JUnit 和 EasyMock 在 MVC 集成测试中模拟 View

java - 在sql中存储unix时间戳

java - 在jtable中计算%,总计

java - GUI - 在 JTextPane 上逐行显示并制作相关的 JProgressBar

java - 是否可以在 Apache Ant build.xml 文件中将字符串拆分为多行?

java - 在 JDialog 中创建 JTabbedPane 并使框架可用

java - 如何从 JFrame 中仅删除最大化按钮?

JAVA - 无法从另一个数组正确填充多维数组