Java JPanel 未绘制
Java JPanel doesnt get painted
我正在编写一个简单的自上而下射击游戏,我正在尝试以活动方式呈现图形,这样 JPanel 就不会被 OS 重绘,我可以控制重绘。
我有一个 Level class,它使用屏幕 class (JPanel) 中的 x 和 y 位置以及关卡或实体的 BufferedImage 调用 render()。我现在的问题是 Screen class 中的 paintComponents() 方法永远不会被调用。我已经尝试了几个变体来解决这个问题。我也用 Canvas 尝试过,但是要么实体开始闪烁,要么我在 createBufferStrategy(3) 上遇到异常。无论如何,这是我的源代码,我真的不知道现在有什么问题。
编辑
这是代码的重要部分,它不起作用,重绘不调用 paintComponent...
public void render(){
if(graphics != null){
graphics.dispose();
}
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(offScreen.getSubimage(0, 0, getWidth(), getHeight()), 0, 0, null);
g.dispose();
Toolkit.getDefaultToolkit().sync();
offScreen.flush();
}
public void render(int x, int y, BufferedImage image) {
graphics = offScreen.createGraphics();
graphics.drawImage(image, x, y, null);
// offScreenGraphics.dispose();
}
问题是 paintComponent 没有被调用,repaint() 什么也没调用,调试器只是检查它。
Canvas 尝试
这是我对 Canvas 的尝试,问题是我无法在取消注释的代码中创建 bufferStrategy。在另一种渲染方法中,它可以工作,但在那里没用。
public void render() {
// if (buffer == null) {
// createBufferStrategy(2);
// buffer = getBufferStrategy();
// }
Graphics g = buffer.getDrawGraphics();
g.drawImage(offScreen, 0, 0, null);
if (g != null) {
g.dispose();
}
if(!buffer.contentsLost()){
buffer.show();
}
}
public void render(int x, int y, BufferedImage image) {
if (buffer == null) {
createBufferStrategy(2);
buffer = getBufferStrategy();
}
Graphics g = offScreen.getGraphics();
g.drawImage(image, x, y, null);
}
希望你能帮助我,也谢谢你对我的帮助。
如果你有其他改进,我也想听听。
您在 JPanel
上的 render
方法应该只更新状态,并且调用 repaint
. The painting will be done in paintComponent
作为对 repaint
.[=16= 的调用结果]
我正在编写一个简单的自上而下射击游戏,我正在尝试以活动方式呈现图形,这样 JPanel 就不会被 OS 重绘,我可以控制重绘。
我有一个 Level class,它使用屏幕 class (JPanel) 中的 x 和 y 位置以及关卡或实体的 BufferedImage 调用 render()。我现在的问题是 Screen class 中的 paintComponents() 方法永远不会被调用。我已经尝试了几个变体来解决这个问题。我也用 Canvas 尝试过,但是要么实体开始闪烁,要么我在 createBufferStrategy(3) 上遇到异常。无论如何,这是我的源代码,我真的不知道现在有什么问题。
编辑
这是代码的重要部分,它不起作用,重绘不调用 paintComponent...
public void render(){
if(graphics != null){
graphics.dispose();
}
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(offScreen.getSubimage(0, 0, getWidth(), getHeight()), 0, 0, null);
g.dispose();
Toolkit.getDefaultToolkit().sync();
offScreen.flush();
}
public void render(int x, int y, BufferedImage image) {
graphics = offScreen.createGraphics();
graphics.drawImage(image, x, y, null);
// offScreenGraphics.dispose();
}
问题是 paintComponent 没有被调用,repaint() 什么也没调用,调试器只是检查它。
Canvas 尝试
这是我对 Canvas 的尝试,问题是我无法在取消注释的代码中创建 bufferStrategy。在另一种渲染方法中,它可以工作,但在那里没用。
public void render() {
// if (buffer == null) {
// createBufferStrategy(2);
// buffer = getBufferStrategy();
// }
Graphics g = buffer.getDrawGraphics();
g.drawImage(offScreen, 0, 0, null);
if (g != null) {
g.dispose();
}
if(!buffer.contentsLost()){
buffer.show();
}
}
public void render(int x, int y, BufferedImage image) {
if (buffer == null) {
createBufferStrategy(2);
buffer = getBufferStrategy();
}
Graphics g = offScreen.getGraphics();
g.drawImage(image, x, y, null);
}
希望你能帮助我,也谢谢你对我的帮助。
如果你有其他改进,我也想听听。
您在 JPanel
上的 render
方法应该只更新状态,并且调用 repaint
. The painting will be done in paintComponent
作为对 repaint
.[=16= 的调用结果]