Java 通过JButton';创建JFrame时不显示;s动作监听器

Java 通过JButton';创建JFrame时不显示;s动作监听器,java,swing,user-interface,jframe,awt,Java,Swing,User Interface,Jframe,Awt,无论如何,在我的书中,关于Swing的使用,我有一个奇怪的问题。 我正在做一个项目,这个项目的目的是显示一张地图,并增加了从一个地址导航到另一个地址的可能性。 我的问题在于之前与Swing(GUI)相关的东西 基本上,该程序允许用户在使用两个不同的数据集之间进行选择,一旦选择了其中一个数据集(通过两个JButton中的一个),就应该生成一个包含加载条的加载帧,并显示程序的数据初始化进度。一旦完成,地图本身就会出现 当两个jbutton中的一个被单击,并且程序尝试用加载帧更新“frame”变量(在

无论如何,在我的书中,关于Swing的使用,我有一个奇怪的问题。 我正在做一个项目,这个项目的目的是显示一张地图,并增加了从一个地址导航到另一个地址的可能性。 我的问题在于之前与Swing(GUI)相关的东西

基本上,该程序允许用户在使用两个不同的数据集之间进行选择,一旦选择了其中一个数据集(通过两个JButton中的一个),就应该生成一个包含加载条的加载帧,并显示程序的数据初始化进度。一旦完成,地图本身就会出现

当两个jbutton中的一个被单击,并且程序尝试用加载帧更新“frame”变量(在调用前一个jbutton的.dispose()方法之后)时,问题再次出现。 简单地说,加载帧不会显示,尽管程序确实完成了加载,并且最终相同的“frame”变量被更新为映射本身,之后映射将完美地工作。 另外有趣的是,如果我完全跳过我的初始数据选择屏幕,直接调用加载开始(使用我选择的数据集),我的加载帧将按它应该的方式工作,按它应该的方式加载,并在地图本身出现后按它应该的方式消失。只有当通过JButtons的ActionListeners调用相同的进程时,加载帧才似乎不想显示出来

我对此感到非常困惑,在来到这里之前,我尝试了很多不同的事情。下面,我将留下一些关键的代码片段,以帮助您准确地理解所有东西是如何相互调用的。我们有一个基于视图模型控制器的程序结构


提前感谢您提供的任何帮助,您可能无法提供相关的帮助,但与其使用多个框架,不如研究使用一个框架,让您交换面板视图。抱歉,我还没有全部阅读,但请尝试1)要更快获得更好的帮助,请发布(最简单的完整和可验证示例)。2) 请看,我不需要在两个或多个帧之间交换,因为我一次只显示一个帧-同样的道理也适用于为什么弹出窗口不是选项,因为加载帧不应该是弹出窗口,而应该显示为应用程序屏幕上的唯一帧。我移除选择屏幕以显示加载过程,然后移除加载屏幕以显示应用程序。我无法在MCVE中重现我的问题,因为我发现这是一个非常奇怪的问题,我认为我无法在其他地方重现。谢谢你们三位的回复。
private Controller() {
    gui = new GUI(createKrakButtonListener(), createOSMButtonListener());
}
public GUI(ActionListener krakListen, ActionListener OSMListen)
{
    frame = new InitialSelectionScreen(krakListen, OSMListen);
}
public class InitialSelectionScreen extends JFrame {
    private static InitialSelectionScreen instance;
    private Dimension prefDimension = new Dimension(300, 250);
    // JButton listeners
    private ActionListener krakListen;
    private ActionListener OSMListen;

    public InitialSelectionScreen(ActionListener krakListen, ActionListener
OSMListen)
    {
        addListenersForSelectionButtons(krakListen, OSMListen);
        setUp();
    }

    private void addListenersForSelectionButtons(ActionListener krakListen,
ActionListener OSMListen)
    {
        this.krakListen = krakListen;
        this.OSMListen = OSMListen;
    }

    private void setUp()
    {
        //Sets the size of the frame
        setSize(prefDimension);
        //Makes the frame open at the center of the screen
        setLocationRelativeTo(null);
        setLayout(new GridLayout(2,1));

        add(createButton("Krak data", krakListen));
        add(createButton("Open Street Maps data", OSMListen));

        pack();
        setVisible(true);
    }

    private JButton createButton(String buttonName, ActionListener listener)
    {
        JButton button = new JButton(buttonName);
        button.setBorder(BorderFactory.createEtchedBorder());
        button.setFont(new Font("Meiryo", 0, 15));
        //button.setPreferredSize(buttonDimension);
        button.addActionListener(listener);
        return button;
    }
}
public class KrakButtonListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        dataChosen = LoaderType.KRAKLOADER;
        initializeLoading();
    }
}

public class OSMButtonListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        dataChosen = LoaderType.OSMLOADER;
        initializeLoading();
    }
}
private void initializeLoading()
{
    gui.setupLoadingScreen();
    model = new Model(dataChosen);
    gui.setupGUI(model);
    //Add listeners
    gui.addTheMouseListener(new MouseListener());
    gui.addTheKeyListener(new KeyListener());

    //Enable the GUI for user interaction
    gui.start();
    gui.enableGUI();
}
@Override
public void setupLoadingScreen()
{
    frame.dispose();
    frame = new LoadingFrame();
}
public class LoadingFrame extends JFrame
{
    public LoadingFrame()
    {
        setEnabled(false);
        setPreferredSize(new Dimension(250, 38));
        //Remove the standard window border from the layout
        setUndecorated(true);
        //Sets the size of the frame
        setSize(250, 38);
        //Makes the frame open at the center of the screen
        setLocationRelativeTo(null);
        //Sets the title
        setTitle("Danmarkskort");

        // Add an indeterminate progress bar, as the program loads its data
        JProgressBar loadBar = LoadBar.getInstanceOf();
        loadBar.setValue(0);
        add(loadBar, BorderLayout.CENTER);

        //Initial statusbar
        StatusBar statusBar = new StatusBar(false);
        statusBar.setText("Loading, please wait...");
        add(statusBar, BorderLayout.SOUTH);

        pack();
        setVisible(true);
    }
}