Графика (java.awt.Graphics) не работает по вызову - PullRequest
0 голосов
/ 01 декабря 2018

Я новичок в программировании на Java, но я кодировал на других языках.У меня проблема, из-за которой я не могу вызвать мой метод Paint(), который содержит некоторые инструкции по рисованию.Я хочу иметь возможность вызывать его внутри функции таймера.Код ниже:

package main;

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 java.util.Timer;
import java.util.TimerTask;
import java.awt.Canvas;

import javax.swing.JPanel;

public class Player extends JPanel implements KeyListener, ActionListener{
    // does the same as inheritiing methods and attributes from "JPanel" class type.

    private static final long serialVersionUID = 1L;
    private static long UUID; 
    // Time to set game-state values
    @SuppressWarnings("unused")
    private boolean isPlaying = false;
    private int startingScore = 0;
    @SuppressWarnings("unused")
    private int currScore = startingScore;

    // currScore should equal startingScore for correct start score when starting each game.
    @SuppressWarnings("unused")
    private int TotalBricks = 21;
    private static Timer timer = new Timer();
    private int delay = 5;

    // Player Start Pos
    private int PlayerX = 310;
    private int PlayerY = 550; // TODO Change PlayerY Value

    // Player Dimensions from Start Coords
    private int PlayerMinX = PlayerX - 50;
    private int PlayerMaxX = PlayerX + 50;
    private int PlayerMinY = PlayerY - 4;
    private int PlayerMaxY = PlayerY + 4;

    // Ball Start Pos
    @SuppressWarnings("unused")
    private int BallX = 120;
    @SuppressWarnings("unused")
    private int BallY = 350;

    // Ball Velocities
    @SuppressWarnings("unused")
    private int BallVelX = -1;
    @SuppressWarnings("unused")
    private int BallVelY = -2;

    public Player(){
        super();
        this.setBackground(Color.white);
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        setVisible(true);
        MyTimer();

        //TODO  Get the bricks to display on screen
    }

    public void MyTimer() {
        TimerTask timerTask;

        timerTask = new TimerTask() {
            @Override
            public void run() { 
                while (true) {
                    // TODO Get Paint() function working in here
                }
            }
        };
         timer.schedule(timerTask, 0, delay);
    }

    public void Paint(Graphics g){
        // linear functions - colour precedes draw, can be overriden without affecting previous statements
        // background
        g.setColor(Color.black);
        g.fillRect(1, 1, 692, 592);

        // border of window
        g.setColor(Color.yellow);
        g.fillRect(0,0,3,592);
        g.fillRect(0,0,692,3);
        g.fillRect(691,0,3,592);

        // no underside border

        // paddle settings
        g.setColor(Color.green);
        g.fillRect(PlayerMinX, PlayerMinY, PlayerMaxX, PlayerMaxY);
        //TODO Check if this works

        // ball settings
        g.setColor(Color.yellow);
        g.fillRect(BallX, BallY, 20, 20);
    }

    public void actionPerformed(ActionEvent arg0) {
    }

    public void keyPressed(KeyEvent arg0) {
        if (arg0.getKeyCode() == KeyEvent.VK_RIGHT)
        {
        }
        else if (true){
        }
    }

    public void keyReleased(KeyEvent arg0) {}

    public void keyTyped(KeyEvent arg0) {} 
}

Любая помощь будет принята с благодарностью.Кроме того, любые советы, которые вы, ребята, могли бы дать, также помогут.Спасибо за любую помощь, которую вы можете предоставить заранее.

1 Ответ

0 голосов
/ 01 декабря 2018
  1. Пользовательская роспись выполняется путем переопределения paintComponent(...), а не рисования (...).Вам также нужно вызвать super.paintComponent(g) в качестве первого оператора, чтобы убедиться, что фон закрашен.

  2. В Java учитывается регистр, поэтому вам необходимо убедиться, что вы переопределяете правильный метод.Вы всегда должны использовать @Override в строке перед методом, который вы переопределяете.Если вы допустите опечатку, компилятор сообщит вам.

  3. Вы должны использовать Swing Timer для анимации.Обновления компонентов Swing должны выполняться в потоке диспетчеризации событий (EDT).Таймер Swing автоматически выполнит код на EDT.

  4. Не используйте цикл while (true) в Таймере.Смысл использования Таймера в том, что Таймер становится петлей.Вы просто выполняете свой код каждый раз, когда срабатывает таймер.

  5. В ActionListener вашего таймера вы изменяете значение своих переменных для обеспечения анимации, а затем вызываете repaint(), которыйприведет к перекрашиванию панели.

  6. Имена переменных НЕ должны начинаться с заглавной буквы.Обратите внимание, как форумы выделяют имена ваших переменных, потому что они думают, что они являются именами классов.Это смущает.Изучите соглашения Java и следуйте им.

  7. Прочитайте Swing Tutorial для основ Swing.Есть раздел на а) Concurrency in Swing б) How to Use Swing Timers в) Custom Painting.

...