单击一个按钮以打开新的JFrame/GUI, [英] Click a button to open a new JFrame / GUI,

查看:65
本文介绍了单击一个按钮以打开新的JFrame/GUI,的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我似乎无法找到使我的代码正常工作的方法. 我正在编写一个程序,直到现在一切正常,我有一些按钮,它们按其应有的方式工作. 但是现在我添加了一个按钮,当用户单击它时,它应该关闭当前的GUI并打开一个新的GUI. 我还想指出,我为此新GUI创建了一个新类.

I seem to not be able to find a way to get my code to work. I am making a program and until now everything was working, i have some buttons and they do what they should. But now i added a button that when a user click it, it should close the current GUI and open a new one. I also want to point out that i created a new class for this new GUI.

我要调用的另一个GUI类是 GuiCrafting ,在该类中,GUI也都进行了编码,并且如果我在 Main 上调用它,则可以正常工作.

The other GUI class that i want to call is the GuiCrafting, in that class the GUI is also all coded, and works if i call it on the Main.

我的问题是我在这里键入什么(我尝试了很多诸如dispose()等操作,但我只收到错误消息):

My question is what do i type here (I tried a lot of things like dispose() etc but i just get error messages) :

  public void actionPerformed(ActionEvent event) {
     
        if( str.equals("Crafting")){


        //insert code to call the GuiCrafting class and open his GUI



        }

在此先感谢您,如果您需要更多帮助,请告诉我.

Thanks in advance and if you need something more please let me know.

推荐答案

当您阅读有关 此处

也许您要使用的是 CardLayout 它管理共享相同显示空间的两个或更多组件(通常为JPanel实例).

Perhaps what you want to use is a CardLayout which manages two or more components (usually JPanel instances) that share the same display space.

点击按钮"Goto Card 2"

TestApp.java:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestApp {

    final static String CARD1 = "Card1";
    final static String CARD2 = "Card2";
    
    public TestApp() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(TestApp::new);
    }

    private void initComponents() {
        JFrame frame = new JFrame("TestApp");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // create the panel that contains the "cards".
        JPanel cards = new JPanel(new CardLayout());

        // card 1 components
        JButton buttonGotoCard2 = new JButton("Goto Card 2");
        buttonGotoCard2.addActionListener((ActionEvent e) -> {
            CardLayout cl = (CardLayout) (cards.getLayout());
            cl.show(cards, CARD2);
        });
        // create card 1
        JPanel card1 = new JPanel();
        card1.add(new JLabel("Card 1"));
        card1.add(buttonGotoCard2);

        // card 2 components
        JButton buttonGotoCard1 = new JButton("Goto Card 1");
        buttonGotoCard1.addActionListener((ActionEvent e) -> {
            CardLayout cl = (CardLayout) (cards.getLayout());
            cl.show(cards, CARD1);
        });
        // create card 2
        JPanel card2 = new JPanel();
        card2.add(new JLabel("Card 2"));
        card2.add(buttonGotoCard1);

        // add cards to cards panel
        cards.add(card1, CARD1);
        cards.add(card2, CARD2);

        frame.getContentPane().add(cards, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

}

还有一个 JDialog 可能就是您想要的.

There is also a JDialog which could be what you want.

如何

您可以轻松地执行类似操作(如果需要,请从另一个打开JFrame ):

You can easily do something like that (Open a JFrame from another If you must):

TestApp.java:

import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

public class TestApp {

    public TestApp() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(TestApp::new);
    }

    private void initComponents() {
        JFrame mainFrame = new JFrame();
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBorder(new EmptyBorder(10, 10, 10, 10));

        JLabel label = new JLabel("JFrame 1");
        JButton button = new JButton("Open JFrame 2");

        button.addActionListener((ActionEvent e) -> {
            this.showNewJFrame(new WindowAdapter() {
                @Override
                public void windowClosing(java.awt.event.WindowEvent e) {
                    // here we listen for the second JFrame being closed so we can bring back the main JFrame
                    mainFrame.setVisible(true);
                }
            });

            // hide the main JFrame
            mainFrame.setVisible(false);
        });

        panel.add(label);
        panel.add(button);

        mainFrame.add(panel);
        mainFrame.pack();
        mainFrame.setVisible(true);
    }

    private void showNewJFrame(WindowAdapter windowAdapter) {
        JFrame frame2 = new JFrame();
        frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // we dont wnat to exit when this JFrame is closed
        
        JPanel panel2 = new JPanel();
        panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
        panel2.setBorder(new EmptyBorder(10, 10, 10, 10));
        
        JLabel label2 = new JLabel("JFrame 2");
        
        panel2.add(label2);
        frame2.add(panel2);

        frame2.addWindowListener(windowAdapter);
        frame2.pack();
        frame2.setVisible(true);
    }
}

这将产生:

,并且当点击"Open JFrame 2" 时:

,当 JFrame 2 关闭时,它将通过WindowAdapter#windowClosing带回主JFrame.

and when JFrame 2 is closed it brings back the main JFrame via the WindowAdapter#windowClosing.

这篇关于单击一个按钮以打开新的JFrame/GUI,的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆