2017-01-04 2 views
1

Итак, у меня есть графический интерфейс с кнопкой для запуска игры. МенюПанель представляет собой главную панель, где должно появиться все. Фактический проект более сложный, но здесь я кратко изложил проблему. Существует главная:Почему панель не появляется?

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(); 

     } 
    }); 

}} 

Существует игра. Это еще не сделано, но оно отображает что-то (без ошибок).

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) { 
}} 

Когда я нажимаю кнопку startBricksBreaker, панель, порожденную классом BricksBreakerGame это не показывая вверх. Что не так? У меня нет ошибок, но игровая панель не появляется. Я предполагаю, что есть проблема с методом actionPerformed, но я не знаю, что там не так ... Я довольно новичок в Java ...

ответ

1

1) menuPanel.removeAll(). Здесь вы удаляете все компоненты панели. Я думаю, что вам нужно скорее удалить панель меню JFrame, чтобы добавить в нее новый BricksBreakerGame. Вы должны сделать: gameFrame.remove(menuPanel).

2) menuPanel.add(bbGame). Здесь вы добавляете панель на панель. Зачем ? Вы должны добавить новую панель в выходящую JFrame, как описано выше: gameFrame.add(bbGame)

2) menuPanel.repaint() не требуется. Вы должны скорее назвать revalidate() и к тому же вы должны вызвать его на более высоком уровне (JFrame) контейнер, а не на JPanel:

gameFrame.revalidate() 

3) bbGame.setVisible(true) is не требуется, так как JFrame уже видна.

Попробуйте это:

@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() и даете ему графику для рисования;)

Смежные вопросы