paintComponent在绘制图像时清除JPanel

时间:2016-12-19 19:12:55

标签: java swing jframe jpanel paintcomponent

我有这段代码:

package game;

import java.awt.Graphics;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Draw {

Object block;

public Draw(JFrame frame, Object object) {
    this.block = object;

    JPanel pane = new JPanel() {
        private static final long serialVersionUID = 3869097656854760151L;

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            try {
                g.drawImage(ImageIO.read(new File(object.getTexture())), object.getX(), object.getY(), object.getWidth(),
                        object.getHeight(), null);
            } catch (IOException e) {
                System.err.println("Image '" + object.getTexture() + "' could not be found!");
            }
        }
    };

    frame.add(pane);
}
}

我在这里打电话给这个班:

package game;

import javax.swing.JFrame;

public class Frame {

private final int X_SIZE = new vena.util.Computer().screenWidth();
private final int Y_SIZE = new vena.util.Computer().screenHeight();

public Frame() {
    JFrame f = new vena.util.Frame().frame("2D Game", X_SIZE - X_SIZE   /   5,  Y_SIZE - Y_SIZE / 5, true, false, false,
            "res/icon.png");

    new Draw(f, new Object(0, 0, 100, 100, "grass"));
    new Draw(f, new Object(100, 0, 100, 100, "grass"));

    f.setVisible(true);
}

public static void main(String[] args) {
    new Frame();
}
}

当我用

调用图像时呈现
new Draw(f, new Object(0, 0, 100, 100, "grass"));

但是当我再次呼叫图像时,它就在旁边

new Draw(f, new Object(100, 0, 100, 100, "grass"));

它只渲染第二个图像,并删除第一个图像。我注意到当我在paintComponent方法中调用g.drawImage()两次时不会发生这种情况。有没有办法让我可以根据需要多次调用Draw类,而无需清除JPanel?

1 个答案:

答案 0 :(得分:2)

框架内容窗格的默认布局管理器是BorderLayout。将组件添加到BorderLayout并且您没有指定约束时,组件将转到CENTER。只有最后添加的组件才能显示在CENTER中。

如果您想在框架上放置多个组件,则可以更改布局管理器。尝试

f.setLayout( new FlowLayout() );

看到差异。

  

我注意到,当我在paintComponent方法中调用g.drawImage()两次时,这不会发生。

是的,如果您尝试在帧上的特定位置绘制图像,那么您应该覆盖paintComponent()来绘制每个图像。