我有以下应用程序。它有效,我只是想更好地理解它。
因此,我从主类中进行以下调用
public static void main(String[] args)
{
Gui gui = new Gui();
gui.startGui();
}
在 GUI 类中
public Gui()
{
initialize();
}
private void initialize()
{
mainWinFrm = new JFrame();
mainWinFrm.setTitle("Inventory Tool");
JMenuBar menuBar = new JMenuBar();
mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH);
.....//allot more GUI staff getting initialize
}
public void startGui()
{
try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {}
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
Gui window = new Gui();
window.mainWinFrm.setLocationRelativeTo(null);
window.mainWinFrm.setMinimumSize(new Dimension(400, 200));
window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.mainWinFrm.pack();
window.mainWinFrm.setVisible(true);
}
catch (Exception e)
{e.printStackTrace();}
}
});
}
上述代码的结构是由 GUI 构建器构建的,我想我正在尝试了解发生了什么。
我不明白的要点是,当我们在主类中构造对象 gui 时,它会初始化所有变量,然后启动线程 gui.startGui()该方法还创建一个新的 GUI 对象窗口并初始化所有变量。
这对我来说似乎不对......但我不确定我是否遗漏了一些东西。
感谢您的建议/帮助 亚历克西斯
最佳答案
首先查看 Initial Threads
Gui
类有点尴尬...但距离可行已经不远了...
在 initialize
中,它创建 UI 的基础知识,在 startUI
中,它切换到事件调度线程,创建 的新实例Gui
并显示主框架...
奇怪的部分是在 startUI
中创建 Gui
的第二个实例。相反,你可以做类似的事情......
public Gui()
{
// It's arguable, but I'm paranoid, so I prefer to do anything related
// to the UI within the EDT...
}
private void initialize()
{
mainWinFrm = new JFrame();
mainWinFrm.setTitle("Inventory Tool");
JMenuBar menuBar = new JMenuBar();
mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH);
.....//allot more GUI staff getting initialize
}
public void startGui()
{
try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {}
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
// Initialize here instead...
initialize();
window.mainWinFrm.setLocationRelativeTo(null);
window.mainWinFrm.setMinimumSize(new Dimension(400, 200));
window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.mainWinFrm.pack();
window.mainWinFrm.setVisible(true);
}
catch (Exception e)
{e.printStackTrace();}
}
});
}
这仍然不合适,因为现在可以在类的部分内容被初始化之前访问它们,相反,我更愿意做一些更像......的事情
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
// Initialise the system look and feel...
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex)
{
}
Gui window = new Gui();
window.mainWinFrm.setLocationRelativeTo(null);
window.mainWinFrm.setMinimumSize(new Dimension(400, 200));
window.mainWinFrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.mainWinFrm.pack();
window.mainWinFrm.setVisible(true);
}
});
}
public Gui()
{
initialize();
}
private void initialize()
{
mainWinFrm = new JFrame();
mainWinFrm.setTitle("Inventory Tool");
JMenuBar menuBar = new JMenuBar();
mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH);
.....//allot more GUI staff getting initialize
}
关于java - 尝试了解 GUI Swing 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18378930/