如何通过JPanels绘制图像

时间:2013-11-11 17:07:56

标签: java swing graphics drawing

我有一个战舰游戏,我试图在Grid对象上绘制船只,命中和未命中。 Grid是JPanel的一个实例,其中包含许多BlocksBlocks也是JPanels,但是Grid的属性。船只在网格上绘制但在块下面。是否可以画出积木?我尝试了Glass Pane并没有太好用。还有其他解决方案吗?

This is how it looks now, the ship is at C3.

2 个答案:

答案 0 :(得分:2)

  

是否可以画出积木?我尝试了Glass Pane和它   做得不太好。还有其他解决方案吗?

是的,非推荐但有时候有用的方法是使用扩展JPanel并覆盖paint(Graphics g)函数:

Class MyGridPane extends JPanel
{

 @Override
    public void paint(Graphics g) {
         super.paint(g); // <----- don't forget to call this

       // then anything you draw will appear above the child component's 
        Graphics2D g2d = (Graphics2D)g.create(); // cloning to work, it is safer aproach
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
        g2d.fillRect(0, 0, getWidth(), getHeight());
        g2d.dispose();// disposing the graphics object 
    }

}

或者,您可以考虑使用JLayeredPane来处理包含目标面板(网格)图层上方绘制图像的面板。 查看How to Use Layered Pane

答案 1 :(得分:0)

  

Blocks也是JPanels,但它们是Grid的属性。这些船是   正在网格上绘制但在Blocks下。

有一种偷偷摸摸的方式来实现它,但您可能需要将基本布局更改为GridBagLayout

基本上,您希望将每个Block添加到自己的单元格中,但GridBagLayout将允许您添加可以展开列和/或行的组件,从而允许添加展开Blocks的船只1}}。

当然,这假设您的船舶和效果基于组件