通过JButton的ActionListener创建时,JFrame不会出现

时间:2014-04-22 16:32:32

标签: java swing user-interface jframe awt

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

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

问题在于,当点击两个JButton中的一个时,程序会尝试更新"框架"变量(在前一个上调用.dispose()方法后)与加载帧。 简单地说,装载框架并没有显示出来,虽然程序确实完成了装载并最终完成了相同的框架和#34;变量被更新为地图本身,后来完美无缺。 另外有趣的是,如果我完全跳过我的初始数据选择屏幕,并直接调用加载开始(使用我选择的数据集),我的加载框架按预期工作,按预期加载,并消失一旦地图本身出现,应该如此。只有通过JButtons调用相同的过程才能实现。 ActionListeners,加载框架似乎不想显示。

我对此感到非常困惑,并且在来到这里之前尝试了许多不同的事情。下面,我将留下我们代码的一些关键部分,以帮助理解一切如何相互呼叫。我们有一个基于View-Model-Controller的程序结构。

提前感谢您提供的任何帮助< 3

程序的主类只是创建一个新的Controller类实例。

Controller类'构造

private Controller() {
    gui = new GUI(createKrakButtonListener(), createOSMButtonListener());
}

" GUI"是类中的私有字段,用于稍后调用方法。 创建监听器的方法只是为初始选择屏幕的按钮创建一个新的buttonlisteners实例。这些显示在下面。

GUI类'构造

public GUI(ActionListener krakListen, ActionListener OSMListen)
{
    frame = new InitialSelectionScreen(krakListen, OSMListen);
}

"框架"在类中,GUI是类中的私有字段,用于定义我们的活动框架(其中一次只能有一个框架)。

InitialSelectionScreen类(可以忽略,按预期工作,相当标准):

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;
    }
}

用于数据选择按钮的ActionListeners,位于Controller:

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();
    }
}

" dataChosen"是一个变量,用于定义程序的模型部分将加载以显示地图的数据集。下一步是调用" initializeLoading()'方法。 特别是,如果直接在Controller的构造函数中调用,它可以使程序与我预定义的任何数据类型完美地运行。只有当它通过这些ActionListener调用时,它似乎无法显示加载框架。

Controller类中的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();
}

我们现在深入研究神秘的程序代码,并查看setupLoadingScreen()方法。我不会展示整个模型 - 考验,因为它与这个问题无关,我想。

setupLoadingScreen():

@Override
public void setupLoadingScreen()
{
    frame.dispose();
    frame = new LoadingFrame();
}

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);
    }
}

所以是的......我认为这就是它的全部。我不确定此时是否还需要显示任何代码。您应该能够在程序执行的这个初始部分中遵循整个路径。

只是澄清一下,使用该程序时会发生以下情况:

  • 启动程序,出现初始选择屏幕
  • 单击Krak-data按钮或OSM-data按钮
  • 初始屏幕消失
  • 在程序运行的10-15秒内没有任何事情发生 创建程序结构的模型部分。 (这是在哪里 加载框应该在那里引导并向用户显示进度 在它之前已经能够装载的 初始选择屏幕的实现。加载框架 没出现)
  • 等待之后,按照正在进行的过程显示地图 ' initializeLoading()'方法

我非常抱歉长时间阅读。感谢您提供的任何帮助!

0 个答案:

没有答案