代码之家  ›  专栏  ›  技术社区  ›  alexis

尝试理解GUI Swing和线程

  •  2
  • alexis  · 技术社区  · 11 年前

    我有以下申请。它有效,我只是想更好地理解它。
    因此,在主课堂上,我打了以下电话

    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构建器构建的,我想我正在努力理解发生了什么。

    我不明白的主要一点是当我们构建对象时 图形用户界面 在main类中,它初始化所有变量,然后启动线程 gui启动gui() 该方法还创建一个新的GUI对象窗口并初始化所有变量。

    我觉得这不对。。。但我不确定自己是否错过了什么。

    谢谢你的建议/帮助 亚历克西斯

    2 回复  |  直到 11 年前
        1
  •  3
  •   MadProgrammer    11 年前

    首先看一下 Initial Threads

    这个 Gui 上课有点尴尬。。。但离可行不远。。。

    initialize 它在 startUI 它正在切换到事件调度线程,生成的一个新实例 并显示主框架。。。

    奇怪的是 启动UI 。相反,你可以做一些事情,比如。。。

    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
    }
    
        2
  •  1
  •   Bharat    11 年前

    更好的方法: 桂类:

    public class Gui {
    private JFrame mainWinFrm;
    
    public Gui() {
        initialize();
    
    }
    
    private void initialize() {
        mainWinFrm = new JFrame();
        mainWinFrm.setTitle("Inventory Tool");
    
        JMenuBar menuBar = new JMenuBar();
        mainWinFrm.getContentPane().add(menuBar, BorderLayout.NORTH);
    
    }
    
    public static void startGui() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception ex) {
        }
    
        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();
        }
    }
    

    }

    以及主要类别:

    public class MainClass {
    public static void main(String[] args) 
    {
     Gui.startGui();
    }
    

    }

    这是一种更好的方式,因为它不创建任何额外的对象。