2013-03-12 111 views
0

我无法添加创建到我的容器类的JPanel类。说实话,我不确定这是否是创建菜单的最佳方法。我问过教授,TA和他们都告诉我不同​​的事情。Java - 如何将JPanel类添加到JFrame容器类?

编辑:澄清,问题是在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类的原因,而且我会有不止一个btw,因为我希望那个班级启动我的游戏线程。我不希望通过视图启动游戏线程。如果这是一个糟糕的设计,请让我知道。

我做顺便说一句,有一个发射类,我认为是无关发布。我知道我做得对,但我和我的大学3-4 TA在我的大学的错误似乎无法找到。

+1

“我无法添加创建到我的容器类的JPanel类”。什么麻烦?设计问题?编译器错误?或不同的建议? – 2013-03-12 18:49:01

+0

对不起,我没有指定。所以它编译但MainMenu类中创建的主菜单不显示,我不知道为什么。代码应该达到,但不是。 – 2013-03-12 20:00:40

回答

0

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

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

如果你继承,你可以调用类本身getContentPane()得到,然后可如果你perfer组合物中使用诸如

getContentPane().add(jpanel); 

的容器,那么你基本上做同样的事情,但你的会员变量持有JFrame。

frame.getContentPane().add(jpanel); 

注意,与许多集装箱,JFrame只支持添加一个项目。因此,如果您想添加多个项目,则需要添加一个JPanel,并将内部项目添加到JPanel

+0

我不确定你是否看过我的代码。我确实添加了jpanel到jframe容器。并且该jpanel包含cardlayout。然后我尝试将主菜单添加到卡上。我也将结果面板添加到框架中。然后我设置框架。 – 2013-03-12 22:37:49