簡體   English   中英

沒有調用paintComponent()

[英]paintComponent() not being called

這是一個應該(理論上)在屏幕上繪制球圖像的小程序。 問題是paintComponent 似乎沒有被調用。 該計划由兩個班級組成。

import java.awt.*;
import java.io.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ScreenSaver extends JPanel {
    private static final long serialVersionUID = 001;

    public static void main(String[] args) {
        new ScreenSaver();
    }
    public ScreenSaver() {
        new Window(1600, 900, "ScreenSaver", this);
    }
    //----------------------------------------------------------------------------------
    private static BufferedImage ball;
    public static BufferedImage getBallSprite() {
            try {
                 File pathToBall = new File("ball.png");
                 ball = ImageIO.read(pathToBall);
            } catch (IOException ex) {
                    ex.printStackTrace();
            }
            return ball;
    }
}
import java.awt.*;
import java.io.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Window extends Canvas {
private static final long serialVersionUID = 002;

    public Window(int width, int height, String title, ScreenSaver ScreenSaver) {
        JFrame frame = new JFrame(title);
        frame.setPreferredSize(new Dimension(width, height));
        frame.setMaximumSize(new Dimension(width, height));
        frame.setMinimumSize(new Dimension(width, height));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        repaint();
    }

    public void paintComponent(Graphics g) {
        System.out.println("Painting...");
        BufferedImage ball = ScreenSaver.getBallSprite();
        g.drawImage(ball, 0, 0, 100, 100, this);
  }
}

如您所見,我測試了是否使用控制台消息調用了paintComponent。 可悲的是,情況並非如此。 有人可以解釋嗎?

java.awt.Canvas不繼承自JComponent所以paintComponent不會被自動調用

public class MyWindow extends JComponent {

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
      ...
}

難怪不調用paintComponent ,因為Canvas沒有您可以覆蓋的paintComponent實現。 使用canvas ,您必須為您的目的覆蓋paint 在您的代碼中,您同時使用JPanelCanvas ,這根本沒有必要。 使用兩者中的任何一個。

以下是Canvas的示例:

import java.awt.*;
import javax.swing.*;

public class ScreenSaver extends Canvas{
    public static void main(String[] args) {
        JFrame window = new JFrame("Screensaver");
        window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        window.setResizable(false);

        ScreenSaver canvas = new ScreenSaver();
        canvas.setPreferredSize(new Dimension(1600, 900));
        canvas.setBackground(Color.BLACK);

        window.add(canvas);
        window.pack();
        window.setLocationRelativeTo(null);
        window.setVisible(true);
    }

    @Override
    public void paint(Graphics g){
        g.setColor(Color.GREEN);
        g.fillOval(100, 100, 100, 100);
    }
}

要覆蓋的方法上方的注釋Override確保編譯器可以在被覆蓋的方法不存在或存在拼寫錯誤的情況下發出警告消息。 我希望這可以進一步幫助您。

暫無
暫無

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

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