繁体   English   中英

Java - 如何将 JPanel 类添加到 JFrame 容器类?

[英]Java - How can I add a JPanel class to a JFrame container class?

我在将创建的 JPanel 类添加到容器类时遇到问题。 老实说,我不确定这是否是创建菜单的最佳方法。 我问过教授和助教,他们都告诉我不同​​的事情。

编辑:澄清一下,问题是没有显示在 JPanel 类中制作的主菜单。 我想我在容器类中正确添加了它,但我不完全确定。

这是我尝试添加到容器中的 JPanel 类:

package.model;
import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class MainMenu extends JPanel {

    private static MainMenu instance;
    private JPanel mainMenu;
    private JButton btnSinglePlayer, btnMultiPlayer, btnScoreBoard, btnQuit;

    private MainMenu() {
            mainMenu();
            singlePlayer();
            multiPlayer();
            scoreBoard();
            quit();
    }

    public static MainMenu getMenuInstance() {
            if (instance == null) {
                    instance = new MainMenu();
            }
            return instance;
    }

    public void construct() {
            mainMenu();
            singlePlayer();
            multiPlayer();
            scoreBoard();
            quit();
    }

    private JPanel mainMenu() {
            mainMenu = new JPanel();
            mainMenu.setLayout(null);
            return mainMenu;
    }

    private JButton singlePlayer() {
            btnSinglePlayer = new JButton("SinglePlayer");
            btnSinglePlayer.setBounds(365, 210, 170, 55);
            mainMenu.add(btnSinglePlayer);
            return btnSinglePlayer;
    }

    private JButton multiPlayer() {
            btnMultiPlayer = new JButton("MultiPlayer");
            btnMultiPlayer.setBounds(365, 300, 170, 55);
            mainMenu.add(btnMultiPlayer);

            return btnMultiPlayer;
    }
    private JButton scoreBoard() {
            btnScoreBoard = new JButton("ScoreBoards");
            btnScoreBoard.setBounds(365, 411, 170, 55);
            mainMenu.add(btnScoreBoard);

            return btnScoreBoard;
    }

    private JButton quit() {
    btnQuit = new JButton("Quit");
    btnQuit.setBounds(365, 500, 170, 55);
    mainMenu.add(btnQuit);

    return btnQuit;
    }
}

这是我的容器类:

package view;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import model.MainMenu;

@SuppressWarnings("serial")
public class MainFrame extends JFrame {

    private static JFrame mainContainer = new JFrame("Checkers");
    private JPanel card = new JPanel(new CardLayout());
    private CardLayout cardLayout = (CardLayout) (card.getLayout());
    private JPanel homeCard, singlePlayerCard, multiPlayerCard, scoreBoardCard;
    private JPanel mainMenu = MainMenu.getMenuInstance();


    public MainFrame() {

    }

    private void addComponentToPane(Container pane) {
        //mainMenu.construct();
        homeCard = new JPanel();
        singlePlayerCard = new JPanel();
        multiPlayerCard = new JPanel();
        scoreBoardCard = new JPanel();

        homeCard.add(mainMenu);
        card.add(homeCard, "homeCard");

        cardLayout.show(card, "homeCard");

        pane.add(card);
    }

    public static void createAndShowGUI() {
        MainFrame frame = new MainFrame();
        frame.addComponentToPane(mainContainer.getContentPane());

        mainContainer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainContainer.pack();
        mainContainer.setSize(920, 650);
        mainContainer.setVisible(true);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        mainContainer.setLocation(dim.width / 2 - mainContainer.getSize().width
                / 2, dim.height / 2 - mainContainer.getSize().height / 2);

    }

}

我想要一个 JPanel 类的原因,而且我会有不止一个 b​​tw,是因为我希望这个类启动我的游戏线程。 而且我不想通过视图启动游戏线程。 如果这是一个糟糕的设计,请告诉我。

顺便说一句,我有一个启动器类,我认为与发布无关。 我知道我做对了,但我和我大学的 3-4 名助教似乎找不到这个错误。

JFrame有一些存在于 Java 程序空间之外的副作用,例如操作系统提供的框架装饰器(通常是边缘句柄、关闭按钮和操作系统驱动的下拉菜单以隐藏/显示/等)

因此,通常不能同时使用经典组合和继承来驱动JFrames

如果继承,则可以调用类自己的getContentPane()来获取容器,然后可以使用,例如

getContentPane().add(jpanel);

如果您更喜欢组合,那么您基本上会做同样的事情,但您的成员变量持有 JFrame。

frame.getContentPane().add(jpanel);

请注意,与许多容器不同, JFrame仅支持添加一项 因此,如果要添加多个项目,则需要添加一个JPanel ,并将内部项目添加到JPanel

private JPanel mainMenu = MainMenu.getMenuInstance(); gets the instance variable from the Class.类中获取实例变量。

add components to the mainMenu JPanel in which is never referred to again.构造器或构建体()方法将组件添加到MAINMENU的JPanel中其从未再次参照。

's mainMenu() method.此外,将 JPanel 的布局设置为 null 是不好的做法,就像在的 mainMenu() 方法中所做的那样。 它将 JPanel 组件的大小设置为 0x0 像素,并且在添加它们时您将看不到 JPanel 内部的组件。

我可以提一两件事,将您的代码正确地重构为方法,并询问有关项目其余部分如何工作的问题,但在撰写本文时,这篇文章已有 8 年历史。 我写这些声明是为了向人们指出正确的方向,如果他们仍然对代码为什么不起作用感到好奇。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM