Я не знаю, почему мой основной класс не получает данные из моего класса Gameplay - PullRequest
1 голос
/ 30 июня 2019

Я совершенно уверен, что при наличии такого количества кода, которое есть у меня в классе Main, должна быть возможность отображать черный фон и другие вещи, которые я записал и описал в своем классе Gameplay, но это не так.

Мой Main класс:

package brickbraker;

public class Main extends Gameplay {

    public static void main(String[] args) {
        JFrame obj = new JFrame();
        Gameplay gamePlay = new Gameplay();
        obj.setBounds(10, 10, 700, 600);
        obj.setTitle("Brick Breaker");
        obj.setResizable(false);
        obj.setVisible(true);
        obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        obj.add(gamePlay);
    }

}

А вот и мой второй класс:

package brickbraker;

public class Gameplay extends JPanel implements KeyListener, ActionListener {
    private int playerX = 310;
    private int ballPosX = 120;
    private int ballPosY = 350;
    private int ballXdir = -1;
    private int ballYdir = -2;

    public Gameplay() {
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);     
    }

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

1 Ответ

1 голос
/ 30 июня 2019

Во-первых, когда вы добавляете компонент в видимый контейнер, вы должны вызывать методы repaint и revalidate. Так что после obj.add(gamePlay); делай obj.repaint(); и obj.revalidate();. В вашем случае вы можете легко obj.add(gamePlay);, а затем obj.setVisible(true);, чтобы избежать использования repaint и revalidate.

Во-вторых, в Gameplay классе вы @Override paint метод вместо paintComponent метода. Должно быть:

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g); //Always call super when overriding paint component
    //Custom painting
}

Наконец, приложения Swing должны запускаться в своем собственном потоке, который называется EDT (Поток диспетчеризации событий). Используйте SwingUtilities#invokeLater, чтобы сделать это. Что-то вроде:

SwingUtilities.invokeLater(() -> {
    JFrame obj = new JFrame();
    Gameplay gamePlay = new Gameplay();
    obj.setBounds(10, 10, 700, 600);
    obj.setTitle("Brick Breaker");
    obj.setResizable(false);
    obj.setVisible(true);
    obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    obj.add(gamePlay);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...