jpanel图形在调整大小等时不重绘

时间:2012-06-15 18:32:46

标签: jpanel repaint

现在我在一个用于收听我的服务器的类中有一个函数,它根据一个管道文件绘制我的游戏地图:

String[] mapSplit = map.split("\\|");

mapWidth = Integer.parseInt(mapSplit[0]);
mapHeight = Integer.parseInt(mapSplit[1]);
String[] groundLayer = mapSplit[2].split(", ");
String[] buildingLayer = mapSplit[3].split(", ");
String[] objectLayer = mapSplit[4].split(", ");
int count = 0;

logger.info("Drawing started.");
for (int x=0; x<mapWidth; x++){
    xDraw = 0;
    for (int y=0; y<mapHeight; y++){
        if (!groundLayer[count].equals("0")){ //don't draw full transparent tiles
            SpriteStore.get().getSprite("images/tiles/" + groundLayer[count] + ".png").draw(m.gamePanel.getGraphics(), xDraw, yDraw);
        }
        if (!buildingLayer[count].equals("0")){ //don't draw full transparent tiles
            SpriteStore.get().getSprite("images/tiles/" + buildingLayer[count] + ".png").draw(m.gamePanel.getGraphics(), xDraw, yDraw);
        }
        if (!objectLayer[count].equals("0")){ //don't draw full transparent tiles
            SpriteStore.get().getSprite("images/tiles/" + objectLayer[count] + ".png").draw(m.gamePanel.getGraphics(), xDraw, yDraw);
        }
        xDraw += 32;
        count++;
    }
    yDraw += 32;
}
logger.info("Drawing done.");

这一切都很好,花花公子。现在我没有游戏循环,因为我正在使用客户端/服务器协议,因此它只绘制一次(当选择字符并完成登录时)。当jpanel所在的jrame被调整大小,或者当我的任何jinternal帧移动到jpanel上时,我的问题就来了。

调整JFrame大小后,整个地图都会消失。

当JInternalFrames在JPanel上移动时,地图将被移除,发生重叠。

我很确定这是因为AWT调用了一个重绘(从我在发布之前看到的一些看法),但我无法得到解决方案。

漂亮我不希望我的JPanel(地图)被清除/删除/编辑,除非我选择更新它。这应该包括,其他组件被拖动,窗口被最小化,另一个(窗口)应用程序覆盖部分/全部JFrame等。任何帮助都将非常感谢。

JInternalFrame obscuring the map

上面的

^^是我的意思,通过拖动JInternalFrame删除拖动的部分^^

修改 我想发布Stefan Haustein帮我来的解决方案!!!

在我的主要课程中我制作了图片:     gamePanelImage = new BufferedImage(gamePanelWidth,gamePanelHeight,BufferedImage.TYPE_INT_ARGB);     gamePanel = new MapGamePanel();

在我的服务器命令监听器中:

logger.info("Drawing started.");
for (int x=0; x<mapWidth; x++){
    xDraw = 0;
    for (int y=0; y<mapHeight; y++){
        //m.gamePanel.getGraphics()
        if (!groundLayer[count].equals("0")){ //don't draw full transparent tiles
            SpriteStore.get().getSprite("images/tiles/" + groundLayer[count] + ".png").draw(MyClient.getGamePanelImage(), xDraw, yDraw);
        }
        if (!buildingLayer[count].equals("0")){ //don't draw full transparent tiles
            SpriteStore.get().getSprite("images/tiles/" + buildingLayer[count] + ".png").draw(MyClient.getGamePanelImage(), xDraw, yDraw);
        }
        if (!objectLayer[count].equals("0")){ //don't draw full transparent tiles
            SpriteStore.get().getSprite("images/tiles/" + objectLayer[count] + ".png").draw(MyClient.getGamePanelImage(), xDraw, yDraw);
        }
        xDraw += 32;
        count++;
    }
    yDraw += 32;
}
logger.info("Drawing done.");

最后我用来覆盖JPanel的类:

package com.jayavon.game.graphics;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.BorderFactory;
import javax.swing.JPanel;

import com.jayavon.game.client.MyClient;

public class MapGamePanel extends JPanel {
    private static final long serialVersionUID = 1L;

    public MapGamePanel() {
        super();
        setLayout(new BorderLayout());
        setBorder(BorderFactory.createLineBorder(Color.black));
    }

    protected void paintComponent(Graphics g) {
        g.drawImage(MyClient.getGamePanelImage(), 0, 0, null);
    }
}

1 个答案:

答案 0 :(得分:1)

你是否覆盖绘画(图形)并在绘画(图形)中进行绘图? 如果没有,那可能是问题所在。

请参阅此处的“绘画方法”:http://java.sun.com/products/jfc/tsc/articles/painting/index.html

如果要避免在paint()(或paintComponent())中重新绘制贴图,请在接收服务器数据时将贴图绘制到BufferedImage(使用图像上的getGraphics)。在paint()中只绘制缓冲区图像。