无论如何,关于使用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);
}
}
所以是的......我认为这就是它的全部。我不确定此时是否还需要显示任何代码。您应该能够在程序执行的这个初始部分中遵循整个路径。
只是澄清一下,使用该程序时会发生以下情况: