java - 尝试了解 GUI Swing 和线程

标签 java multithreading swing swingbuilder

我有以下应用程序。它有效,我只是想更好地理解它。
因此,我从主类中进行以下调用

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/

相关文章:

c# - System.Threading.Thread 在 .NET Core 中的含义与在 .NET Framework 中的含义相同吗?

c# - 晚上 10 点后抛出 System.OutOfMemoryException。我无法捕捉到实际的错误

java - 我如何在 JTabbedPane 的选项卡中添加 JScrollPane

java - 如何使我的 Swing JComboBox 水平扩展而不是垂直扩展?

java - 当该方法位于主 GUI 类之外时,该方法不会将数据加载到 jTable

java - 为什么 JVM 在其变量超出范围后不销毁 JFrame 对象?

java - 如何创建一个能够支持@JsonFilter注解的POJO的全局过滤器

java - Rxjava Android如何使用Zip运算符

java - "Dynamically"在Java中执行代码

.net - 如何确保应用程序结束时后台线程结束?