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