我有一个Java应用程序,它应该显示Gui1然后转到Gui 2,我成功做到了,然后从Gui2回到Gui 1,我在做时遇到了问题。那么当我在 Gui2 中按下按钮时,我怎么能回到 Gui 1
Gui1 code
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Gui1 extends JFrame {
private JButton btn=new JButton("Open Gui2");
public Gui1()
{
super(" GUI1");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btn.addActionListener(new ButtonListener());
btn.setActionCommand("Open");
add(btn);
}
class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e)
{
String cmd = e.getActionCommand();
if(cmd.equals("Open"))
{
dispose();
new Gui2();
}
}
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable(){
public void run()
{
new Gui1().setVisible(true);
}
});
}
}
GUI2
代码import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Gui2 extends JFrame
{
private JButton btn1= new JButton("Go Back to Gui 1");
public Gui2()
{
super("Another GUI");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(btn1);
setVisible(true);
}
}
要返回,请使用以下代码:
public class Gui2 extends JFrame {
private JButton btn1 = new JButton("Go Back to Gui 1");
public Gui2() {
super("Another GUI");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(btn1);
btn1.addActionListener(new Gui2.ButtonListener());
btn1.setActionCommand("back");
setVisible(true);
}
private class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("back")) {
dispose();
new Gui1().setVisible(true);
}
}
}
为了实现这一点,你可以尝试将Gui1
类的引用传递到Gui2
类的构造函数中,并创建一个私有属性来存储你的第一个窗口。然后只需创建一个实现ActionListener
并隐藏/显示所需窗口的按钮。
对两个类都使用ButtonListener
。仍有改进的余地,但这是一个基于您的代码的解决方案,可以工作。ButtonListener
现在将调用JFrame
作为参数,以便在需要时将其关闭。
我还将setVisible(true);
的位置从 main() 更改为两个构造函数。
桂1
public class Gui1 extends JFrame {
private JButton btn = new JButton("Open Gui2");
public Gui1() {
super(" GUI1");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btn.addActionListener(new ButtonListener(this));
btn.setActionCommand("Open");
add(btn);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Gui1();
}
});
}
}
桂2
public class Gui2 extends JFrame {
private JButton btn1 = new JButton("Go Back to Gui 1");
public Gui2() {
super("Another GUI");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btn1.addActionListener(new ButtonListener(this));
btn1.setActionCommand("Open");
add(btn1);
setVisible(true);
}
}
按钮侦听器
public class ButtonListener implements ActionListener {
JFrame caller = null;
public ButtonListener(JFrame caller) {
this.caller = caller;
}
public ButtonListener() {}
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (cmd.equals("Open")) {
if (caller instanceof Gui1) {
new Gui2();
} else {
new Gui1();
}
caller.dispose();
}
}
}
尝试只使用一个 JFrame,方法是制作 Gui1 和 Gui2 面板。您可以通过删除第一个面板然后添加第二个面板来轻松在它们之间切换。
getContentPane().removeAll(); //gets rid of first panel
getContentPane().add(panel); //adds desired panel to frame
validate(); //updates frame with new panel