[英]Repaint() method doesn't invoke paint() & paintComponent() methods one by one, only paintComponent () method is working
[英]repaint() doesn't invoke paintComponent()
我正在嘗試用Java制作乒乓球游戲,但沒有用。 我已經做了一些測試,似乎變量正在更新,但是當我執行repaint();
在計時器actionPerformed(ActionEvent e)
中未調用paintComponent()
方法
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class PongGame extends JComponent implements ActionListener, MouseMotionListener{
public int state = 1;
public int paddleX;
public String buttonColor = "blue";
public int mouseX, mouseY;
private int ballX = 400;
private int ballY = 150;
public static void main(String[] args){
JFrame window = new JFrame("Pong");
PongGame game = new PongGame();
window.add(new PongGame());
window.pack();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocationRelativeTo(null);
window.setResizable(false);
window.setVisible(true);
Timer t = new Timer(20, game);
t.start();
}
public Dimension getPreferredSize(){
return new Dimension(800, 600);
}
public void paintComponent(Graphics g){
paddleX = mouseX;
g.setColor(Color.WHITE);
g.fillRect(0,0, 800, 600);
g.setColor(Color.BLACK);
g.fillRect(paddleX, 550, 150, 15);
g.fillOval(ballX, ballY, 30, 30);
}
@Override
public void actionPerformed(ActionEvent e) {
ballX = ballX + 10;
ballY = ballY + 10;
System.out.println(ballX + " " + ballY);
}
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
mouseX = e.getX();
repaint();
}
}
您尚未將實現的MouseMotionListener
注冊到任何組件:
game.addMouseMotionListener(game);
您沒有將第一個創建的PongGame
實例添加到框架中,而是添加了一個新的產生錯誤:
PongGame game = new PongGame(); window.add(new PongGame()); // <<--- why creating the new instance ? // it should be window.add(game);
作為一種好的編程習慣:嘗試將添加偵聽器代碼放在組件自己的創建上下文中,即放在其構造函數中,以使您的代碼更具可讀性。
問題是:
PongGame game = new PongGame();
window.add(new PongGame());
您有兩個PongGame
實例。 一個添加到框架中( new PongGame()
),另一個添加到game
(該game
實際上對計時器做出反應)。 將此行更改為:
window.add(game);
更正實際問題。 添加一個構造函數(在本地測試):
PongGame() {
addMouseMotionListener(this);
}
repaint()不會直接調用paint()。 它調度對中間方法update()的調用。 最后,update()調用paint()(除非您覆蓋update)。
這種復雜性的原因是Java對並發編程的支持。 它使用線程來做到這一點。
至少出於三個原因,使用repaint()可能很棘手。
我建議您使用update()嘗試相同的操作。
有用的鏈接: http : //www.scs.ryerson.ca/~mes/courses/cps530/programs/threads/Repaint/index.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.