一种选择
不要使用组件(即JLabels)创建游戏环境。相反,您可以绘制所有游戏对象。
例如,如果您正在执行以下操作:
JLabel[][] labelGrid = JLabel[][];...ImageIcon icon = new ImageIcon(...);JLabel label = new JLabel(icon);...for(... ; ... ; ...) { container.add(label);}相反,您可以一起去除所有标签,也可以使用
Images代替
ImageIcons,然后可以将所有图像绘制到单个组件表面上。也许像这样:
public class GamePanel extends JPanel { Image[][] images = new Image[size][size]; // init images @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image,); } }Grapchics.drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)
因此,要解决位置问题(即x和y,哦以及大小),我们可以使用一些好的旧的OOP抽象。创建一个包装图像,位置和尺寸的类。例如
class LocatedImage { private Image image; private int x, y, width, height; private ImageObserver observer; public LocatedImage(Image image, int x, int y, int width, int height, ImageObserver observer) { this.image = image; ... } public void draw(Graphics2D g2d) { g2d.drawImage(image, x, y, width, height, observer); }}然后,您可以在面板中使用一堆此类的实例。就像是
public class GamePanel extends JPanel { List<LocatedImage> imagesToDraw; // init images // e.g. imagesToDraw.add(new LocatedImage(img, 20, 20, 100, 100, this)); @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D)g.create(); for (LocatedImage image: imagesToDraw) { image.draw(g2d); } g2d.dispose(); } }一旦有了这个概念,就有很多不同的可能性。
- 请参阅“执行自定义绘画”,以获取有关绘画的一些一般性想法。



