簡體   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