如何使用仅使用 1 个 JFrame 的 swing 制作应用程序?

How to make an app using swing that only uses 1 JFrame?

我正在制作应用程序或 (something.exe)。我想制作一个 class 作为我的主框架。那是因为我不想为我将制作的每个 class 创建新框架。我希望我的 class MainMenu 具有 MainFrame 的框架,我可以在其中放置按钮等

package ThinkNotOfficial;

public class Main {

    public static void main(String[] args) {

        MainFrame mainFrame = new MainFrame();

    }
}
package ThinkNotOfficial;

import javax.swing.*;
import java.awt.*;

public class MainFrame extends JFrame{

    // Global Variables
    JFrame mainFrame = new JFrame("Base Frame (global)");
    ImageIcon logo = new ImageIcon("Logo.png");

    MainFrame (){
        mainFrame.setSize(500, 500);
        mainFrame.setResizable(false);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setIconImage(logo.getImage());
        mainFrame.getContentPane().setBackground(new Color(255,255,255));
        mainFrame.setLocationRelativeTo(null);
        mainFrame.setLayout(null);

        mainFrame.setVisible(true);

        // ------------ PROGRAM FIELD -----------



    }
}
package ThinkNotOfficial;

import javax.swing.*;

public class MainMenu{

    // ------------ Global Variables ------------
    JButton play = new JButton("PLAY");

    MainMenu(){
        // ------------ PLAY button ------------
        play.setSize(100,50);

        // ------------ Adding parts ------------

    }
}

利用

您还可以利用CardLayout来帮助方便不同视图之间的切换,例如

import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new MainPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MainPane extends JPanel {

        private CardLayout cardLayout;
        private MenuPane menuPane;
        private GamePane gamePane;

        public MainPane() {
            cardLayout = new CardLayout();
            setLayout(cardLayout);

            menuPane = new MenuPane(new MenuPane.Observer() {
                @Override
                public void didStartGame(MenuPane source) {
                    cardLayout.show(MainPane.this, "game");
                }
            });
            gamePane = new GamePane(new GamePane.Observer() {
                @Override
                public void gameDidEnd(GamePane source, int score) {
                    cardLayout.show(MainPane.this, "menu");
                }
            });

            add(menuPane, "menu");
            add(gamePane, "game");
        }

    }

    public class MenuPane extends JPanel {

        public interface Observer {

            public void didStartGame(MenuPane source);
        }

        public MenuPane(Observer observer) {
            setLayout(new GridBagLayout());
            JPanel contentPane = new JPanel(new GridLayout(-1, 1));
            JButton startButton = new JButton("Start");
            startButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    observer.didStartGame(MenuPane.this);
                }
            });

            contentPane.add(startButton);
            add(contentPane);
        }

    }

    public class GamePane extends JPanel {

        public interface Observer {
            public void gameDidEnd(GamePane source, int score);
        }

        public GamePane(Observer observer) {
            setLayout(new GridBagLayout());
            add(new JLabel("All your game is belong to us"));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }
}

JTabbedPane 也是允许用户在不同视图之间切换的好方法,请参阅 How to Use Tabbed Panes 了解更多详细信息