我的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();
}
}
答案 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方法的位置,时间和方式)。
一般诊断资源:
2. This post对于为何不使用paintComponent()
并使用repaint()
提出了非常好的立场。我从未遇到过需要与paintComponent()
建立路径的情况,但我已经多次使用repaint()
。
答案 2 :(得分:0)
您在游戏循环中调用repaint
,但repaint
并不保证窗口会重新绘制,因此可能无法调用paintComponent
。您应该使用paintImmediately
。
paintImmediately(0, 0, 1920, 1080);