繁体   English   中英

没有调用paintComponent()

[英]paintComponent() doesn't get called

我的paintComponent()不会被调用。

我用谷歌搜索了一下,还没有找到我可以使用的答案。 起初,我没有frame.getContentPane().add(this) ,并认为答案是插入它,但都没有奏效。 我希望有人可以帮助我。

在这里你有我的代码的一小段:

package engine;

import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Frame extends JPanel {
    private static final long serialVersionUID = 1L;
    private JFrame frame = new JFrame();
    private GameEngine engine;
    private Game game;

    public Frame(GameEngine engine) {
        this.engine = engine;
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setUndecorated(true);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);
        frame.setSize(1920, 1080);
        frame.getContentPane().add(this);
    }

    public void updateGame(Game game) {
        this.game = game;
    }

    public JFrame getFrame() {
        return frame;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.drawString("" + game.getClockDate(), 1920 - 100, 20);
        System.out.println("test");
    }
}

我从这里调用它,在另一个类中:

public void loop() {
    if (this.ingame) {
        game.loop();
        frame.updateGame(game);
        frame.repaint();
    }
}

尝试调用 super() 作为构造函数的第一行,以便您的 JPanel 正确初始化。

public Frame(GameEngine engine) {
    super();
    this.engine = engine;
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setUndecorated(true);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(null);
    frame.setSize(1920, 1080);
    frame.getContentPane().add(this);
}

还可以调用 @Override 注释来清除代码。

@Override    
public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.drawString("" + game.getClockDate(), 1920 - 100, 20);
        System.out.println("test");
}

请发布您尝试绘制此 Frame 对象的上下文(您在 Frame 对象中使用该绘制方法的位置、时间和方式)。

一般诊断资源:

1.继承层次

2. 这篇paintComponent()对于为什么不使用paintComponent()而使用repaint()有很好的说明。 我从来没有遇到过需要使用paintComponent()构建路径的情况,但是我已经能够多次使用repaint()

您在游戏循环中调用repaint ,但repaint并不能保证窗口会被重绘,因此可能不会调用paintComponent 您应该改为使用paintImmediately

paintImmediately(0, 0, 1920, 1080);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM