paintComponent()不会被调用

时间:2017-01-17 20:03:53

标签: java swing

我的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();
    }
}

3 个答案:

答案 0 :(得分:0)

尝试调用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");
}

答案 1 :(得分:0)

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

一般诊断资源:

1. Inheritance Hierarchy

2. This post对于为何不使用paintComponent()并使用repaint()提出了非常好的立场。我从未遇到过需要与paintComponent()建立路径的情况,但我已经多次使用repaint()

答案 2 :(得分:0)

您在游戏循环中调用repaint,但repaint并不保证窗口会重新绘制,因此可能无法调用paintComponent。您应该使用paintImmediately

paintImmediately(0, 0, 1920, 1080);