Java Swing JPanel rapaint 不调用paintComponent

问题描述 投票:0回答:1

我有以下代码:

package de.luiskun.handling;

import de.luiskun.UtilityTool;

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

public class PixelArtCreator extends JPanel implements Runnable{

    BufferedImage imgBefore;
    Thread gameThread;

    public static final int width = 900, height = 500;

    int fps = 60;

    public PixelArtCreator() {
        this.setPreferredSize(new Dimension(width, height));
        this.setDoubleBuffered(true);
        this.setLayout(null);
        this.setDoubleBuffered(true);
        this.setFocusable(true);

        imgBefore = UtilityTool.SetupImage("res/preparation/00001", 512, 512);
    }

    @Override
    public void paintComponent(Graphics g) {
        System.out.println(1);
        Graphics2D g2 = (Graphics2D) g;
        if(imgBefore != null) {
            g2.drawImage(imgBefore, 10, 10, 512, 512, null);
        }
    }

    public void startGameThread() {
        gameThread = new Thread(this);
        gameThread.start();
    }

    @Override
    public void run() {
        double drawInterval = 1000000000 / fps; // 0.0166s
        double delta = 0;
        double lastTime = System.nanoTime();
        double currentTime;
        while (gameThread != null) {
            currentTime = System.nanoTime();
            delta += (currentTime - lastTime) / drawInterval;
            lastTime = currentTime;
            if (delta >= 1) {
                System.out.println(2);
                //update();
                this.repaint();
                delta--;
            }
        }
    }
}

主要课程:

package de.luiskun;

import de.luiskun.handling.PixelArtCreator;

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

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(PixelArtCreator.width+14, PixelArtCreator.height+38);
        frame.setLocationRelativeTo(null);
        frame.setLayout(null);
        frame.setResizable(false);

        PixelArtCreator s = new PixelArtCreator();
        frame.add(s);
        frame.setVisible(true);

        s.setUpTimer();
    }

}

在 main 方法中,我创建一个 JFrame,然后添加 PixelArtCreator。然后我调用startGameThread。

控制台只打印出“2”,但不打印“1”。我不知道为什么 repaint 不调用 PaintComponent。

我在很多项目中使用了这段代码,但现在奇怪的是它不再工作了。

java swing paintcomponent repaint
1个回答
0
投票

我更改了 Main 方法中的一些内容,现在它可以工作了。但我之前没发现问题。

package de.luiskun;

import de.luiskun.handling.PixelArtCreator;

import javax.swing.*;

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {

        JFrame window = new JFrame();
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setResizable(false);
        PixelArtCreator pac = new PixelArtCreator();
        window.add(pac);

        window.pack();

        window.setLocationRelativeTo(null);
        window.setVisible(true);

        pac.startTimer();
    }

}
package de.luiskun.handling;

import de.luiskun.UtilityTool;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

public class PixelArtCreator extends JPanel {

    BufferedImage imgBefore;
    Thread gameThread;
    Timer timer;

    public static final int width = 900, height = 532;

    int fps = 60;

    public PixelArtCreator() {
        this.setPreferredSize(new Dimension(width, height));
        // this.setBounds(0,0,width,height);
        this.setLayout(null);
        this.setDoubleBuffered(true);
        this.setFocusable(true);

        imgBefore = UtilityTool.SetupImage("res/preparation/00001", 512, 512);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        if(imgBefore != null) {
            g2.drawImage(imgBefore, 10, 10, 512, 512, null);
        }
    }

    public void startTimer() {
        timer = new Timer(10,new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                repaint();
            }
        });
        timer.start();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.