2014-10-25 5 views
0

JPanel startPan은 애플릿이 시작될 때 표시되지만, 지금은 JButton setupGame 만 표시됩니다. 하지만 setupGameBut을 클릭 한 다음 cancelBut을 실행하여 startPan으로 돌아 가면 규칙이 표시되지만 JLabel headingLab (setupPan에 표시됨)이 표시되지 않습니다.Java : CardLayout에 JPanels가 올바르게 표시되지 않습니다.

그뿐만 아니라 현재 표시된 패널 뒤에있는 다른 패널의 구성 요소를 표시하지만 상호 작용할 수는 없습니다.

버튼을 클릭하면 다음 카드를로드하기 전에 커서를 멀리두면 다시 마우스를 올릴 때까지 거기에 표시되어야하는 버튼으로 업데이트되지 않습니다. 나는 내가 근본적으로이 코드를 가지고 뭔가 잘못하고 있다는 느낌이 들지만 나는 확신하지 못한다.

/* 
*Java Version:  1.8.0_25 
*Author:   Peadar Ó Duinnín 
*Student Number: R00095488 
*/ 

package As1; 

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Choice; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.GridLayout; 
import java.awt.Insets; 
import java.awt.event.ActionEvent; 
import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 


public class AUIApplet extends JApplet { 
    private final int APPLET_WIDTH; 
    private final int APPLET_HEIGHT; 
    private final int[] highScores = new int[3]; 
    private int currentScore; 

    final Font normalFont = new Font("Cambria", Font.PLAIN, 18); 
    final Font headingFont = new Font("Cambria", Font.BOLD, 24); 
    JPanel contPan, startPan, setupPan, gamePan, scorePan, startInfoPan, gameInfoPan, rulePan, setupInfoPan, gameOptPan; 
    JButton setupGameBut, cancelBut, endGameBut, startGameBut; 
    JLabel highScoreLab, currentScoreLab, headingLab, rulesLab, difficultyScoreLab; 
    Choice difficulty; 
    CardLayout cl = new CardLayout(); 

    public AUIApplet() { 
     this.APPLET_HEIGHT = 400; 
     this.APPLET_WIDTH = 600; 
     for (int i : highScores) { 
      i = 0; 
     } 
    } 

    @Override 
    public void init() { 
     //set applet size 
     setSize(APPLET_WIDTH, APPLET_HEIGHT); 

     //start screen 
     startPan = new JPanel(); 
     startPan.setLayout(new BorderLayout()); 

     //setup screen 
     setupPan = new JPanel(); 
     setupPan.setLayout(new BorderLayout()); 

     setupGameBut = new JButton("New Game"); 
     cancelBut = new JButton("Cancel"); 

     //game screen 
     gamePan = new JPanel(); 
     gamePan.setLayout(new BorderLayout()); 

     endGameBut = new JButton("Quit Game"); 

     //heading label 
     headingLab = new JLabel("Number Memory"); 
     headingLab.setFont(headingFont); 

     //rule panel 
     rulePan = new JPanel(); 
     rulePan.setLayout(new GridLayout(8,1)); 
     rulePan.add(new JLabel("Rules:")); 
     rulePan.add(new JLabel("1. You will be shown a series of numbers, one at a time.")); 
     rulePan.add(new JLabel("2. You must recite the series of numbers after the last number has been displayed.")); 
     rulePan.add(new JLabel("3. After each correct recitation of the sequence, another sequence will play with one extra number.")); 
     rulePan.add(new JLabel("Note: You can decrease/increase the time each number displays for by changing the difficulty.")); 

     //difficulty selection 
     difficulty = new Choice(); 
     difficulty.add("Easy"); 
     difficulty.add("Normal"); 
     difficulty.add("Hard"); 
     difficulty.add("Extra Hard"); 
     difficulty.select(1); 

     difficultyScoreLab = new JLabel("" + highScores[1] + ""); 

     switch(difficulty.getSelectedIndex()) { 
      case 0: difficultyScoreLab.setText("" + highScores[0] + ""); 
       break; 
      case 1: difficultyScoreLab.setText("" + highScores[1] + ""); 
       break; 
      case 2: difficultyScoreLab.setText("" + highScores[2] + ""); 
       break; 
      case 3: difficultyScoreLab.setText("" + highScores[3] + ""); 
       break; 
     } 

     //game option panel 
     gameOptPan = new JPanel(); 
     gameOptPan.setLayout(new GridLayout(1,2)); 
     startGameBut = new JButton("Start Game"); 
     gameOptPan.add(startGameBut); 
     gameOptPan.add(difficulty); 

     //start info panel 
     startInfoPan = new JPanel(); 
     startInfoPan.setLayout(new BorderLayout()); 
     startInfoPan.add(rulePan, BorderLayout.CENTER); 

     //setup info panel 
     setupInfoPan = new JPanel(); 
     setupInfoPan.setLayout(new BorderLayout()); 
     setupInfoPan.add(gameOptPan, BorderLayout.SOUTH); 
     setupInfoPan.add(new JLabel("High Score:"), BorderLayout.NORTH); 
     setupInfoPan.add(difficultyScoreLab, BorderLayout.CENTER); 

     //game info panel 
     gameInfoPan = new JPanel(); 
     gameInfoPan.setLayout(new BorderLayout()); 

     //score panel 
     scorePan = new JPanel(); 
     scorePan.setLayout(new GridLayout(10,1)); 
     highScoreLab = new JLabel("High Score: " + highScores[difficulty.getSelectedIndex()] + " "); 
     currentScoreLab = new JLabel("Current Score: " + currentScore + " "); 
     scorePan.add(highScoreLab); 
     scorePan.add(currentScoreLab); 

     //adding to start panel 
     startPan.add(setupGameBut, BorderLayout.SOUTH); 
     startPan.add(headingLab, BorderLayout.NORTH); 
     startPan.add(startInfoPan, BorderLayout.CENTER); 

     //adding to setup panel 
     setupPan.add(cancelBut, BorderLayout.SOUTH); 
     setupPan.add(headingLab, BorderLayout.NORTH); 
     setupPan.add(setupInfoPan, BorderLayout.CENTER); 

     //adding to game panel 
     gamePan.add(endGameBut, BorderLayout.SOUTH); 
     gamePan.add(headingLab, BorderLayout.NORTH); 
     gamePan.add(gameInfoPan, BorderLayout.CENTER); 
     gamePan.add(scorePan, BorderLayout.EAST); 

     //setting up container panel and adding each screen to it 
     contPan = new JPanel(); 
     contPan.setLayout(cl); 
     contPan.add(startPan, "Start Applet Screen"); 
     contPan.add(setupPan, "Setup Game Screen"); 
     contPan.add(gamePan, "New Game Screen"); 

     //action listeners 
     setupGameBut.addActionListener((ActionEvent e) -> { 
      newGame(); 
     }); 

     startGameBut.addActionListener((ActionEvent e) -> { 
      startGame(); 
     }); 

     cancelBut.addActionListener((ActionEvent e) -> { 
      quitGame(); 
     }); 

     endGameBut.addActionListener((ActionEvent e) -> { 
      quitGame(); 
     }); 

     //add container panel 
     this.add(contPan); 
    } 

    @Override 
    public void paint(Graphics g) { 

    } 

    public void newGame() { 
     cl.show(contPan, "Setup Game Screen"); 
    } 

    public void startGame() { 
     cl.show(contPan, "New Game Screen"); 
    } 

    public void quitGame() { 
     cl.show(contPan, "Start Applet Screen"); 
     if (currentScore > highScores[difficulty.getSelectedIndex()]) { 
      highScores[difficulty.getSelectedIndex()] = currentScore; 
     } 
     currentScore = 0; 
    } 

    @Override 
    public Insets getInsets() { 
     return new Insets(10, 10, 10, 10); 
    } 
} 
+1

'paint()'를 오버라이드하지 마십시오. 이렇게하는 이유는 거의 없으며 빈 방법이있는 이유를 생각할 수 없습니다. 빈 메서드는 문제를 일으킬 수밖에 없습니다. – camickr

+0

@camickr 나중에 그림을 그리는 프로그램 (대학의 Application User Interfaces 모듈)에서 사용하고 있으므로 Graphics 클래스를 사용하여 페인트 칠하는 방법을 보여줘야합니다. 그러나 그 모든 것을 고쳤습니다. 감사! 나는 그것을 구현할 때 모든 것을 깨뜨리지 않는 방법을 찾아야 만한다. –

+0

@camickr이 상황에서 무엇을 해야할지 모르겠다. 질문을 삭제합니까? 또는 답변을 추가 하시겠습니까? –

답변

2

paint()을 덮어 쓰지 마십시오.

이렇게하는 이유는 거의 없으며 빈 방법이있는 이유를 생각할 수 없습니다. 빈 방법은 페인트를 오버라이드 (override)하지 않는 아직

물건

그림 내가 나중에 내 프로그램에서 사용하고 문제

을 일으킬 수밖에 없다(). 커스텀 페인팅은 JPanel (또는 JComponent)의 paintComponent(...) 메소드를 오버라이드 (override) 한 다음 애플릿에 패널을 추가한다.

자세한 내용과 예제는 Custom Painting의 스윙 튜토리얼 섹션을 참조하십시오.

관련 문제