如何在Java中单击按钮时返回上一个GUI

时间:2015-06-16 07:18:47

标签: java swing user-interface

我有一个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);
    }
}

4 个答案:

答案 0 :(得分:1)

返回上一个GUI,您可以使用以下代码:

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

}

答案 1 :(得分:0)

为实现此目的,您可以尝试将Gui1类的引用传递给Gui2类的构造函数,并创建一个存储第一个窗口的私有属性。然后只需创建一个实现ActionListener的按钮并隐藏/显示所需的窗口。

答案 2 :(得分:0)

对这两个课程使用ButtonListener。 仍有改进的余地,但这是一个基于您的代码的解决方案,可行。 ButtonListener现在将调用JFrame作为参数在需要时关闭它。

我还将setVisible(true);的位置从main()更改为两个构造函数。

GUI1

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

        });
    }
}

GUI2

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

ButtonListener

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

答案 3 :(得分:0)

通过制作Gui1和Gui2面板,只尝试使用一个JFrame。您可以通过删除第一个面板然后添加第二个面板轻松地在它们之间切换。

      getContentPane().removeAll(); //gets rid of first panel
      getContentPane().add(panel); //adds desired panel to frame
      validate(); //updates frame with new panel