JPanel快速切换isDisplayable()

时间:2016-03-14 12:20:44

标签: java swing jpanel rendering

基本上,我正在编写一个基于扫雷的游戏,并且很难让网格正确渲染。网格类扩展了JPanel,并正确添加到JFrame中。

这是我的渲染方法:

public void buildTexture(){
    if(this.isDisplayable()){
        System.out.println("Can display panel");
        image = this.createImage(this.getWidth(), this.getHeight());
        Graphics g = image.getGraphics();
        g.setColor(Color.gray);
        g.fillRect(0, 0, image.getWidth(this), image.getHeight(this));
        Tile[][] t = getCurrentSide();
        for(int a = 0; a < t.length; a++){
            for(int b = 0; b < t.length; b++){
                if(t[a][b].visible){
                    Image i = t[a][b].getCurrentImage();
                    g.drawImage(i, 20*a, 20*b, this);
                }
            }
        }
        this.prepareImage(image, this);
        g.dispose();
    }else{
        System.out.println("Cannot display panel");
    }
}

image是一张图片,声明为:

image = createImage(getWidth(), getHeight());

上述方法由此线程调用,在构造函数中定义并启动。

Thread repainter = new Thread(){

        @Override
        public void run() {
            while (repaint) {
                buildTexture();
                repaint();
                try {
                    sleep(20);//50 ticks a second
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }

    };
    repainter.start();

基本上,问题如下:使用此代码,输出如下所示:

Cannot display panel
Can display panel
Can display panel
Cannot display panel
Cannot display panel
Can display panel
Cannot display panel
Can display panel
Can display panel
Cannot display panel
Cannot display panel
Can display panel
Can display panel
Cannot display panel
Can display panel
Cannot display panel
Can display panel
Cannot display panel

我已经确认getCurrentSide()getCurrentImage()按预期工作。 我还验证了JFrame启用的{{1}}是可见的,启用的,可聚焦的和有效的。

编辑:澄清一下,我希望它只输出&#34;可以显示面板&#34;

编辑:我用计时器替换了线程。切换现在不那么随机,它现在切换每次迭代。

1 个答案:

答案 0 :(得分:0)

我没有使用Thread / Timer来调用repaint()和buildTexture(),而是将buildTexture()放在paintComponent(Graphics)中,并使用传入该方法的图形。这完全解决了我遇到的问题。