Java 试图理解GUI Swing和线程

Java 试图理解GUI Swing和线程,java,multithreading,swing,swingbuilder,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("

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

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.startGui。该方法还创建一个新的gui对象窗口并初始化所有变量

这对我来说似乎不对。。。但是我不确定我是否遗漏了什么

谢谢你的建议/帮助 亚历克西斯是一个更好的方法: Gui类:

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

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

更好的方法: Gui类:

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


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

从查看

Gui类有点笨拙…但离可操作性不远

在初始化中,它创建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
}

首先看一看

Gui类有点笨拙…但离可操作性不远

在初始化中,它创建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
}

请看一下使用initialize方法和startGui方法是没有意义的。startGui方法是启动Swing UI的正确方法—它似乎不正确—Gui对象创建了两次:第一次在main中,第二次在startGui中。也许startGui应该声明为静态的,并称为Gui.startGui。是什么工具生成了这段代码?实际上,如果您在startGui方法中删除GUI的构造,那么它就更有意义了……removeguiwindow=newgui;图形用户界面也应该在EDT中创建。有很多旧的建议没有遵循这些建议,但建议已经更改,因此最好使用invokeLater将所有内容都封装在main中。看看使用initialize方法和startGui方法是没有意义的。startGui方法是启动Swing UI的正确方法—它似乎不正确—Gui对象创建了两次:第一次在main中,第二次在startGui中。也许startGui应该声明为静态的,并称为Gui.startGui。是什么工具生成了这段代码?实际上,如果您在startGui方法中删除GUI的构造,那么它就更有意义了……removeguiwindow=newgui;GUI也应该在EDT中创建。有很多旧的建议没有遵循,但建议已经改变,所以最好用invokeLater将所有内容都封装在main中。我可能会试图保护构造函数,以防止任何主体意外创建classwell的实例,这只是一个提示,不是最终的代码。开发人员应该始终使用预防措施来提高代码的效率,robustI可能会试图保护构造函数,以防止任何主体意外创建类实例。这只是一个提示,而不是最终的代码。开发人员应始终使用预防措施,以使代码高效和健壮