簡體   English   中英

單擊一個按鈕打開一個新的 JFrame/GUI,

[英]Click a button to open a new JFrame / GUI,

我似乎無法找到讓我的代碼工作的方法。 我正在制作一個程序,直到現在一切正常,我有一些按鈕,他們做他們應該做的。 但是現在我添加了一個按鈕,當用戶單擊它時,它應該關閉當前的 GUI 並打開一個新的。 我還想指出,我為這個新的 GUI 創建了一個新的 class。

我想調用的另一個 GUI class 是GuiCrafting ,在 class 中,GUI 也全部編碼,如果我在Main上調用它就可以工作。

我的問題是我在這里輸入什么(我嘗試了很多諸如 dispose() 之類的東西,但我只是收到錯誤消息):

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


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



        }

在此先感謝您,如果您需要更多信息,請告訴我。

多個JFrame不受歡迎,您可以在此處此處閱讀

也許您想要使用的是CardLayout ,它管理共享相同顯示空間的兩個或多個組件(通常是JPanel實例)。

在此處輸入圖像描述

點擊“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可能是您想要的。

然而

您可以輕松地執行類似的操作(如果必須,從另一個打開JFrame ):

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

這會產生:

在此處輸入圖像描述

當點擊“打開 JFrame 2”時:

在此處輸入圖像描述

JFrame 2關閉時,它通過WindowAdapter#windowClosing帶回主要的JFrame

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM