我正在开发一个必须绘制地图的应用程序。
我有一个JPanel
网格,其中包含JPanel
个单元格的二维数组。
我用这个:
public class myCell extends JPanel {
...
@Override
public void paint(Graphics g){
super.paint(g);
if (imageForeground != null) {
g.drawImage(imageForeground, 0, 0, this);
}
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(imageBackground, 0, 0, this);
}
}
这会绘制我的背景图像,并将我的前景图像绘制在它上面。
我想在一个单元格中绘制一个图像,该图像将显示在其他单元格的TOP上,即绘制一个比单元格大的图像,来自单元格,如:
@Override
public void paint(Graphics g){
super.paint(g);
super.drawImage(imageForeground, 0, 0, this);
or
g.drawImage(imageForeground, 0, 0, this, overflowFromPanel == true);
}
或者如果可能的话,告诉图像它可能比我的Cell更大。
有关更多信息:
背景细胞的大小均为1 * 1。必须在它传播的所有背景图像上绘制前景图像。
例如,如果我在[1,1]平方上绘制3 * 3小时,它必须超过[1,1],[1,2],[1,3],[2,1] ]等等......
答案 0 :(得分:3)
自定义绘画是通过覆盖paintComponent()方法完成的,而不是paint()。
我正在开发一个必须绘制地图的应用程序。
因此背景图像是地图并覆盖整个面板。然后将房子涂在地图上。
因此,在父组件中,您重写paintComponent()
并绘制背景图像
然后在CellPanel
中,覆盖paintComponent()
并绘制前景图像。虽然,为什么不使用带有ImageIcon的JLabel,所以你不需要自定义绘画?
如果我在[1,1]广场画了3 * 3小时,
然后你需要将你的房子图像添加到9个单元格。
另一种选择是忘记将地图定义到单元格中。而是创建一个具有两个属性的自定义对象:
然后将此自定义Object添加到ArrayList。然后在主面板的paintCompont()方法中迭代遍历此ArrayList并在指定位置绘制每个图像。
@Overide
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(...); // paint the background
for (each item in the ArrayList)
{
Point p = item.getPoint();
Image image = item.getImage();
g.drawImage(...);
}
}
编辑:
注意:背景是每个细胞的不同图像。
你为什么使用细胞?听起来你有一个固定大小的网格。因此,您可以将单个单元格图像绘制为更大的BufferedImage,从而为所有单元格生成单个背景图像。然后你可以在背景之上画房子。
另一种选择是使用OverlayLayout
。它允许您将两个面板堆叠在一起。
所以逻辑就像是:
JPanel panel = new JPanel();
panel.setLayout( new OverlayLayout(panel) );
panel.add( foregroundPanel );
panel.add( backgroundPanel );
你需要:
paintComponent(...)
方法来进行自定义绘制。或者您可以使用JLayeredPane
。