JFrame中的JFileChooser使setVisible()冻结

时间:2015-03-19 17:18:09

标签: 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(),则框架显示正常。

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

1 个答案:

答案 0 :(得分:4)

  

最让我感到震惊的是,在FileChooser出现的情况下,框架中出现了十次。

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

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

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

此外,类名(“lab7”)应以大写字母开头。如果这是一个SSCCE无关紧要,请保持一致。