单击一个按钮打开一个新的 JFrame/GUI,

2022-01-24 00:00:00 java swing jframe

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

我要调用的另一个 GUI 类是 GuiCrafting,在该类中,GUI 也全部编码,如果我在 Main 上调用它就可以工作.

我的问题是我在这里输入什么(我尝试了很多诸如 dispose() 之类的东西,但我只是收到错误消息):

 public void actionPerformed(ActionEvent event) {if(str.equals(工艺")){//插入代码以调用 GuiCrafting 类并打开他的 GUI}

提前致谢,如果您需要更多信息,请告诉我.

解决方案

不赞成使用多个 JFrame,因为您可以阅读

点击按钮后Goto Card 2"

TestApp.java:

import java.awt.BorderLayout;导入 java.awt.CardLayout;导入 java.awt.event.ActionEvent;导入 javax.swing.JButton;导入 javax.swing.JFrame;导入 javax.swing.JLabel;导入 javax.swing.JPanel;导入 javax.swing.SwingUtilities;公共类TestApp {最终静态字符串 CARD1 = "Card1";最终静态字符串 CARD2 = "Card2";公共TestApp(){初始化组件();}公共静态无效主要(字符串[]参数){SwingUtilities.invokeLater(TestApp::new);}私人无效initComponents(){JFrame frame = new JFrame("TestApp");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//创建包含卡片"的面板.JPanel 卡片 = 新 JPanel(new CardLayout());//卡片 1 组件JButton buttonGotoCard2 = new JButton("Goto Card 2");buttonGotoCard2.addActionListener((ActionEvent e) -> {CardLayout cl = (CardLayout) (cards.getLayout());cl.show(卡片,CARD2);});//创建卡片 1JPanel card1 = new JPanel();card1.add(new JLabel("Card 1"));card1.add(buttonGotoCard2);//卡片 2 组件JButton buttonGotoCard1 = new JButton("Goto Card 1");buttonGotoCard1.addActionListener((ActionEvent e) -> {CardLayout cl = (CardLayout) (cards.getLayout());cl.show(卡片,CARD1);});//创建卡片 2JPanel card2 = new JPanel();card2.add(new JLabel("Card 2"));card2.add(buttonGotoCard1);//将卡片添加到卡片面板卡片.add(card1, CARD1);卡片.add(card2, CARD2);frame.getContentPane().add(cards, BorderLayout.CENTER);框架.pack();frame.setVisible(true);}}

还有一个

当Open JFrame 2"被点击时:

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

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.

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.

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.

解决方案

Multiple JFrames are frowned upon as you can read about here and here

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

After clicking the button "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);
    }

}

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

HOWEVER

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

This produces:

and when the "Open JFrame 2" is clicked:

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

相关文章