0

作成した JPanel クラスをコンテナー クラスに追加できません。正直なところ、これがメニューを作成するための最良の方法であるかどうかはわかりません. 私は教授やTAに尋ねましたが、彼らは皆、私にさまざまなことを教えてくれました.

編集: 明確にするために、問題は 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 クラスを持ちたい理由は、そのクラスがゲーム スレッドを起動するようにしたいからです。ビューからゲームスレッドを起動したくありません。これが悪いデザインである場合は、私に知らせてください。

私はところで、ランチャークラスを持っていますが、これは投稿には関係ないと思います。私はそれを正しく行ったことを知っていますが、私と私の大学の3〜4人のTAに隣接するエラーは見つけられないようです。

4

2 に答える 2

1

JFrameオペレーティング システムが提供するフレーム デコレータ (通常はエッジ ハンドル、閉じるボタン、OS 駆動のドロップダウン メニューを非表示/表示/など) のように、Java プログラム空間の外部に存在するいくつかの副作用があります。

そのため、通常、従来の構成と継承をJFrames同時に使用することはできません。

継承する場合、クラス自身getContentPane()を呼び出してコンテナーを取得し、次のように使用できます。

getContentPane().add(jpanel);

構成を優先する場合は、基本的に同じことを行いますが、JFrame を保持するメンバー変数を使用します。

frame.getContentPane().add(jpanel);

多くのコンテナーとは異なり、1 つのアイテムのJFrame追加のみがサポートされていることに注意してください。したがって、複数のアイテムを追加する場合は、 を追加し、 にインテリア アイテムを追加する必要があります。JPanelJPanel

于 2013-03-12T21:03:18.640 に答える