2013-03-12 2 views
0

컨테이너 클래스에 생성 한 JPanel 클래스를 추가하는 데 문제가 있습니다. 솔직하게 말해서, 이것이 내 메뉴를 만드는 가장 좋은 방법인지 잘 모르겠습니다. 나는 교수님들에게 물어 봤고 TA들과 그들은 모두 다른 것들을 말해 줬어.자바 - JPanel 클래스를 JFrame 컨테이너 클래스에 추가하려면 어떻게해야합니까?

EDIT : JPanel 클래스에서 만든 주 메뉴는 표시되지 않습니다. 컨테이너 클래스에서 제대로 추가했다고 생각하지만 완전히 확신 할 수는 없습니다.

이 내가 컨테이너에 추가하려고 해요 내 JPanel의 클래스입니다 :

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의 클래스를 갖고 싶어하는 이유 : 여기

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; 
    } 
} 

그리고 내 컨테이너 클래스 , 그리고 나는 하나 이상의 btw를 가질 것입니다. 왜냐하면 그 클래스가 내 게임 스레드를 시작하기를 원하기 때문입니다. 그리고 나는보기를 통해 게임 스레드를 시작하고 싶지 않습니다. 이것이 나쁜 디자인이라면 알려주세요.

저는 게시자 클래스를 가지고 있습니다. 게시자에게는 게시와 관련이없는 것으로 생각됩니다. 나는 그것을 올바르게했다는 것을 알고 있습니다. 나는 대학에서 3-4 TA의 오류를 발견 할 수 없습니다.

+1

"컨테이너 클래스에 생성 한 JPanel 클래스를 추가하는 데 문제가 있습니다." 어떤 문제가 있습니까? 디자인 문제? 컴파일러 오류? 또는 다른 조언? –

+0

오, 미안합니다. 그래서 컴파일하지만 MainMenu 클래스에서 생성 된 메인 메뉴는 보이지 않습니다. 왜 그런지 모르겠습니다. 코드에 도달해야하지만 그렇지는 않습니다. –

답변

0

JFrame에는 운영 체제가 제공하는 프레임 장식 자 (일반적으로 가장자리 핸들, 닫기 버튼 및 숨겨진/표시 할 드롭 다운 메뉴 등)와 같이 Java 프로그램 공간 외부에 몇 가지 부작용이 있습니다.)

이와 같이 일반적으로 JFrames을 구동하는 데는 클래식 구성 및 상속을 사용할 수 없습니다.

당신은 당신이 기본적으로 같은 일을하지만, 귀하의 회원과 함께, 당신은 클래스의 자신의 getContentPane() 당신이 구성을 perfer 경우 다음과 같은

getContentPane().add(jpanel); 

을 사용할 수있는 용기를 얻기 위해 호출 할 수 있습니다 상속하는 경우 JFrame을 보유하는 변수. 많은 용기와는 달리, JFrame 항목을 추가하여 지원하는

frame.getContentPane().add(jpanel); 

참고. 따라서 여러 항목을 추가하려면 JPanel을 추가하고 JPanel에 내부 항목을 추가해야합니다.

+0

내 코드를 살펴 본 것이 확실하지 않습니다. 실제로 jframe 컨테이너에 jpanel을 추가했습니다. 그 jpanel에는 카드 레이아웃이 포함되어 있습니다. 그런 다음 카드에 기본 메뉴를 추가하려고했습니다. 또한 결과 패널을 프레임에 추가했습니다. 그런 다음 프레임을 설정합니다. –

관련 문제