Java 从另一个类运行GUI

Java 从另一个类运行GUI,java,swing,user-interface,Java,Swing,User Interface,我在一个类“ClientGUI.java”中创建了GUI,并尝试在另一个类(“Client.java”)中创建一个实例。GUI只是由两个按钮(“前进”和“后退”)组成,一次只显示一个按钮。 一开始,GUI似乎工作正常,因为只需一个按钮即可显示框架。然而,一旦按下按钮,它就会消失,不会被第二个按钮取代。 通过设置断点,我发现调用了正确的ActionListener函数,删除了第一个按钮,但没有添加第二个按钮 GUI类“ClientGUI.java”: 以及我想使用GUI的类“Clients.jav

我在一个类“ClientGUI.java”中创建了GUI,并尝试在另一个类(“Client.java”)中创建一个实例。GUI只是由两个按钮(“前进”和“后退”)组成,一次只显示一个按钮。 一开始,GUI似乎工作正常,因为只需一个按钮即可显示框架。然而,一旦按下按钮,它就会消失,不会被第二个按钮取代。 通过设置断点,我发现调用了正确的ActionListener函数,删除了第一个按钮,但没有添加第二个按钮

GUI类“ClientGUI.java”:

以及我想使用GUI的类“Clients.java”:

import java.net.*;
import GUI.ClientGUI;

public class Client {

    public static void main(String[] args) {
        Client client = new Client();
    }

    Client() {
        String[] args = {"ggg", "vvv"};

            try {
                new ClientGUI().main(args);
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
}
谢谢你的帮助

  • 永远不要调用
    main
    方法。
    main
    方法是让JVM知道程序的入口点
  • 不要使用两种
    main
    方法。无论哪个是入口点程序,都只能在该程序中使用
    main
    方法
  • 只需使用构造函数。当第一个GUI调用第二个GUI时,将构造构造函数中的所有内容
  • 这是一个改进版。它起作用了

    • 我从
      ClientGUI
    • 我从
      Client
      类中的
      main
      调用了
      ClientGUI.createAndShowGUI()

  • 永远不要调用
    main
    方法。
    main
    方法是让JVM知道程序的入口点
  • 不要使用两种
    main
    方法。无论哪个是入口点程序,都只能在该程序中使用
    main
    方法
  • 只需使用构造函数。当第一个GUI调用第二个GUI时,将构造构造函数中的所有内容
  • 这是一个改进版。它起作用了

    • 我从
      ClientGUI
    • 我从
      Client
      类中的
      main
      调用了
      ClientGUI.createAndShowGUI()


    您不应该调用
    init
    。来自另一个班级。您应该从构造函数调用它。但在您的情况下,它可能不起作用,因为您在JPanel中的类添加到
    init
    中的帧中,因此如果您从构造函数调用
    init
    ,您将得到一个无限循环。看看我的答案。我只是做了一些简单的修正。但是,在良好的实践方面,还有更多的地方可以改进。@mKorbel我也有同样的想法,但OP并没有试图使用两个独立的框架。问题似乎是这样的,但OP只是试图从另一个加载GUI的类运行GUI类。@peeskillet可能是一个很好的切入点/切入点,但没有OPs反应……。您不应该调用
    init
    。来自另一个班级。您应该从构造函数调用它。但在您的情况下,它可能不起作用,因为您在JPanel中的类添加到
    init
    中的帧中,因此如果您从构造函数调用
    init
    ,您将得到一个无限循环。看看我的答案。我只是做了一些简单的修正。但是,在良好的实践方面,还有更多的地方可以改进。@mKorbel我也有同样的想法,但OP并没有试图使用两个独立的框架。问题似乎是这样的,但OP只是试图从另一个加载GUI的类运行GUI类。@peeskillet可能是一个很好的例子,但没有OPs的反应……。感谢您的解释和代码示例!我假设SwingUtilities.invokeLater是在客户端类的main方法中调用的?是的,我在添加SwingUtilities时意外删除了
    main
    。再次感谢您的快速响应。撇开所有的坏习惯不谈,我相信主要的问题是“newclientgui().main(args);”。如果该行改为“ClientGUI.main(args);”(或CreateAndShow方法),那么它已经可以工作了。您能解释一下在那里创建ClientGUI对象的具体问题吗?问题是您的
    ClientGUI
    本身就是一个
    JPanel
    。因此,如果只是实例化它,它什么也不做,因为
    JPanel
    需要父容器。因此,在您的案例中实例化它是无用的。我所做的不是实例化它,而是静态地调用它的
    createAndShowGUI
    ,因为这是一个带有
    JFrame
    的方法,它将类
    JPanel
    添加到它中。而且就像我说的,你永远不想调用
    main
    方法。JVM会为您这样做。而且您不应该有两个
    main
    方法。因此,您需要做的就是
    ClientGUI.main(args),只要删除你脑海中的想法:)谢谢你的解释和代码示例!我假设SwingUtilities.invokeLater是在客户端类的main方法中调用的?是的,我在添加SwingUtilities时意外删除了
    main
    。再次感谢您的快速响应。撇开所有的坏习惯不谈,我相信主要的问题是“newclientgui().main(args);”。如果该行改为“ClientGUI.main(args);”(或CreateAndShow方法),那么它已经可以工作了。您能解释一下在那里创建ClientGUI对象的具体问题吗?问题是您的
    ClientGUI
    本身就是一个
    JPanel
    。因此,如果只是实例化它,它什么也不做,因为
    JPanel
    需要父容器。因此,在您的案例中实例化它是无用的。我所做的不是实例化它,而是静态地调用它的
    createAndShowGUI
    ,因为这是一个带有
    JFrame
    的方法,它将类
    JPanel
    添加到它中。而且就像我说的,你永远不想调用
    main
    方法。JVM会为您这样做。而且您不应该有两个
    main
    方法。因此,您需要做的就是
    ClientGUI.main(args),只需删除你脑海中的想法:)
    
    import java.net.*;
    import GUI.ClientGUI;
    
    public class Client {
    
        public static void main(String[] args) {
            Client client = new Client();
        }
    
        Client() {
            String[] args = {"ggg", "vvv"};
    
                try {
                    new ClientGUI().main(args);
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
        }
    }
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.net.*;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class Client {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new Client();
                }
            });
        }
    
        Client() {
            String[] args = {"ggg", "vvv"};
    
            try {
                ClientGUI.createAndShowGUI();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    class ClientGUI extends JPanel implements ActionListener {
    
        private static JButton btnForward = new JButton("Forward"),
                btnBackward = new JButton("Backward");
    
    
    
        public ClientGUI() throws MalformedURLException {
            setLayout(new BorderLayout());
    
            add(btnForward, BorderLayout.CENTER);
    
            btnForward.addActionListener(this);
            btnBackward.addActionListener(this);
        }
    
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == btnForward) {
                remove(btnForward);
    
                add(btnBackward, BorderLayout.CENTER);
    
                revalidate();
                repaint();
            } else if (e.getSource() == btnBackward) {
                remove(btnBackward);
    
                add(btnForward);
    
                revalidate();
                repaint();
            }
        }
    
        public static void createAndShowGUI() throws MalformedURLException {
            JFrame frame = new JFrame("ClientGUI");
    
            frame.setMinimumSize(new Dimension(500, 400));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(new ClientGUI());
    
            frame.setSize(500, 400);
            frame.setVisible(true);
        }
    }