2017-01-04 8 views
1

私はゲームを開始するためのボタンを備えたGUIを持っています。 menuPanelは、すべてが表示されるメインパネルを表します。実際のプロジェクトはより複雑ですが、ここでは問題をまとめました。 メインがあります:パネルが表示されないのはなぜですか?

package bbGame; 

import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 



public class Main { 

public static void main(String[] args) { 
    JFrame gameFrame = new JFrame(); 
    gameFrame.setSize(700, 600); 
    gameFrame.setVisible(true); 
    JPanel menuPanel = new JPanel(); 
    menuPanel.setLayout(null); 
    menuPanel.setBounds(0, 0, 700, 600); 
    menuPanel.setBackground(new Color(243, 207, 252)); 
    menuPanel.setVisible(true); 


    gameFrame.add(menuPanel); 

    JButton startBricksBreakerButton = new JButton(); 
    startBricksBreakerButton.setText("START BRICKS BREAKER"); 
    startBricksBreakerButton.setLayout(null); 
    startBricksBreakerButton.setBounds(250, 200, 180, 50); 
    startBricksBreakerButton.setBackground(new Color(37, 242, 10)); 
    startBricksBreakerButton.setVisible(true); 
    menuPanel.add(startBricksBreakerButton); 
    startBricksBreakerButton.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      menuPanel.removeAll(); 
      BricksBreakerGame bbGame=new BricksBreakerGame(); 
      menuPanel.add(bbGame); 
      bbGame.setVisible(true); 
      menuPanel.repaint(); 

     } 
    }); 

}} 

ゲームがあります。まだ完了していませんが、何かを表示しています(エラーなし)。私はBricksBreakerGameクラスによって生成されたパネルは、それが現れていない、startBricksBreakerボタンをクリックし

package bbGame; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

public class BricksBreakerGame extends JPanel implements KeyListener, ActionListener { 

private boolean play = false; 
private int score = 0; 

private int totalBricks = 21; 

private Timer time; 
private int speed = 8; 

private int playerX = 310; 

private int ballposX = 120; 
private int ballposY = 350; 
private int ballXdir = -1; 
private int ballYdir = -2; 

public BricksBreakerGame() { 
    addKeyListener(this); 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(false); 
    // timer = new Timer(delay, this); 
    // timer.start(); 
} 

public void paint(Graphics g) { 
    // background 
    g.setColor(Color.black); 
    g.fillRect(1, 1, 692, 592); 
    // borders 
    g.setColor(Color.yellow); 
    g.fillRect(0, 0, 3, 592); 
    g.fillRect(0, 0, 692, 3); 
    g.fillRect(691, 0, 3, 592); 

    // the paddle 
    g.setColor(Color.green); 
    g.fillRect(playerX, 550, 100, 8); 

    // the ball 
    g.setColor(Color.yellow); 
    g.fillRect(ballposX, ballposY, 20, 20); 
} 

@Override 
public void actionPerformed(ActionEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyPressed(KeyEvent e) { 
    // TODO Auto-generated method stub 
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     if (playerX >= 600) { 
      playerX = 600; 
     } else { 
      moveRight(); 
     } 
    } 
    if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     if (playerX < 100) { 
      playerX = 100; 
     } else { 
      moveLeft(); 
     } 
    } 

} 

private void moveRight() { 
    play = true; 
    playerX += 20; 

} 

private void moveLeft() { 
    play = true; 
    playerX -= 20; 

} 

@Override 
public void keyReleased(KeyEvent arg0) { 
} 

@Override 
public void keyTyped(KeyEvent arg0) { 
}} 

。なにが問題ですか?私はエラーはありませんが、ゲームパネルは表示されません。私はactionPerformedメソッドに問題があると想定していますが、何が間違っているのか分かりません...私はJavaにはかなり新しいです...

答えて

1

1)menuPanel.removeAll()ここでは、パネルのすべてのコンポーネントを削除します。私はあなたの代わりに新しいBricksBreakerGameを追加するためにJFrameのメニューパネルを削除する必要がありますと思う。 する必要があります:gameFrame.remove(menuPanel)

2)menuPanel.add(bbGame)。ここでパネルをパネルに追加します。どうして ?上に説明したように、新しいパネルを既存のに追加する必要があります。gameFrame.add(bbGame)

2)menuPanel.repaint()は必要ありません。 JFrameがすでに表示されているので、

gameFrame.revalidate() 

3)bbGame.setVisible(true) isは必要ありません:あなたは、むしろJPanel上(JFrame)コンテナではなく、あなたがより高いレベルでそれを呼び出す必要がありrevalidate()を呼び出し、ほかにする必要があります。

それを試してみてください。

@Override 
    public void actionPerformed(ActionEvent e) { 
     gameFrame.remove(menuPanel); 
     BricksBreakerGame bbGame=new BricksBreakerGame(); 
     gameFrame.add(bbGame); 
     gameFrame.revalidate(); 
    } 
0

私は推測し、あなたの問題は、あなたのBricksBrakerGameに何かを追加しないこと、です。 BricksBrakerGameコンストラクタに以下を追加しよう:

this.setSize(100, 100); 
this.setBackground(Color.BLACK); 

あなたが左上隅に黒のJPanelが表示されるはずです。

または単にpaint()メソッドを呼び出して、塗りつぶすためにグラフィックを指定してください;)

関連する問題