2013-03-26 76 views
2

因此,我有一个JLayeredPane(实际上是一个JLayeredPane子类)。这是一个JPanel。我想添加一个BufferedImage到Jpanel。向JLayerPane上的JPanel添加BufferedImage

public class BigMap extends JLayeredPane implements MouseListener 
    JPanel mapPanel; 
    BufferedImage theMap; 
    public BigMap (BufferedImage m){ 
    theMap = m; 
    mapPanel = new JPanel(); 
    add(mapPanel, 0); 
    mapPanel.setBounds(0, 0, 640, 640); 
    //other unimportant stuff 
    } 

    @Overrride 
    public void paintComponent (Graphics g){ 
    super.paintComponent(g); 
    Graphics2D gmap = (Graphics2D) mapPanel.getGraphics(); 
    gmap.drawImage(theMap, null, 0, 0); 
    //some other stuff which is working just fine 
    } 

问题是没有显示BufferedImage。 JPanel肯定存在,因为我可以设置它的背景颜色,如果我愿意的话。我意识到JLayeredPane没有布局管理器,并且必须为JPanel设置界限,但是这对JPanel本身不应该是一个问题,当然?鉴于BufferedImage没有方法直接控制其大小,我不明白我是如何克服的,如果是。

任何帮助表示赞赏。

+0

'mapPanel.getGraphics()'当你已经有方法参数的'Graphics g'时,你为什么试图获得另一个'Graphics'对象?无论如何,您检索的图形可能无效。一般来说,不要在组件上使用'getGraphics'。 – 2013-03-26 18:50:24

+0

这只是因为我最终会在JLayeredPane上放置其他JPanel,并带有自己的图像。这是企图保持整洁 - 每个小组的图形负责其内容。不好的做法? – MrB 2013-03-26 19:05:09

+0

_Panel负责自己的内容。不好的做法_不,但是这是在代码调用'paint/paintComponent'之前完成的。你应该永远不需要照顾图形,Swing会在适当的时候提供适当的图形。不要在任何组件上调用'getGraphics',你应该没问题。 – 2013-03-26 23:44:54

回答

2

这里的问题是,您覆盖分层窗格的paintComponent()方法,而不是JPanelJPanel稍后将作为分层窗格的子项之一进行绘制,这将消除您绘制的内容。

一般来说,paintComponent()方法应该绘制到给定的Graphics中,而不是绘制到其他组件的图形中。

+0

啊,我没有意识到这一点。我想回到教程。非常感谢你,接受并赞成。 – MrB 2013-03-26 18:42:55

+0

现在完美工作,根据您的回答作出更改。再次感谢你。 – MrB 2013-03-26 19:05:48