簡體   English   中英

repaint()不調用paintComponent()

[英]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()可能很棘手。

  1. repaint()和GUI線程完成的自發繪畫之間的交互
  2. repaint()只是要求線程系統安排對update()/ paint()的調用,然后退出這一事實。 repaint()方法是異步的。
  3. 防止您的圖形在更新時被刪除的問題。

我建議您使用update()嘗試相同的操作。

有用的鏈接: http : //www.scs.ryerson.ca/~mes/courses/cps530/programs/threads/Repaint/index.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM