将图像绘制到AWT上并初始化图形

时间:2012-09-03 14:37:52

标签: java graphics

如果可以的话,我会先告诉你我想做什么,因为我不确定我努力奋斗的路线是实现目标的最佳途径。

我有一个包含两个JPanel的JFrame。一个包含许多按钮(buttonPanel),另一个是最初的空白(displayPane)。按下按钮时,displayPanel中显示的内容会发生变化。这样做的方法是每次按一个按钮都会创建一个新对象,扩展JPanel,然后将其添加到displayPane

所以上述所有工作都很好并且花花公子(虽然我承认它可能不是最好的方法),除了一个特殊情况。

在这种特殊情况下,我需要创建一个JLayeredPanel,然后在其上绘制一个剪切图像。 JLayeredPanel因为我想在它上面绘制一些东西,因为我只想显示该区域的一部分(确切的部分传递给构造函数)。

现在,我遇到的问题是这个。我知道绘制剪裁图像的唯一方法是通过g=thingie.getGraphics(), g.setClip(Shape shape), g.drawImage(various)。但是,所有这些都依赖于能够获得图形。但是因为我首先组装了对象,所以没有与JLayeredPane关联的图形对象(因为它没有显示)所以getGraphics返回null并且g.setClip()抛出了空指针异常。

显然我在某种程度上和某个地方做错了。任何帮助将不胜感激,如果问题令人困惑,抱歉。我试图尽可能多地包含细节,现在我有点担心我已经弄糊涂了这个问题。我会密切关注这一点并在必要时澄清。

1 个答案:

答案 0 :(得分:1)

警告!:错误的答案,见下面的行

为什么不直接创建一个新的Graphics对象,在其上绘画然后将其与update()方法一起使用?

Graphics g = new Graphics();
g.drawStuff();
thingie.update(g);

这显示正确

如评论中所述,先前的解决方案是错误的,但可以使用Double缓冲区,创建缓冲图像并在其上绘制,然后覆盖jLayeredPane窗格的paint方法以绘制图像。

    private void addStuff() {            
        BufferedImage bi =
            new BufferedImage(100, 100, BufferedImage.TYPE_4BYTE_ABGR);
        Graphics bufferedGraphics = bi.getGraphics();
        //Paint stuff
        bufferedGraphics.drawLine(0, 0, 50, 50);
        javax.swing.JLayeredPane layered;
        layered = new JLayeredPane() {
            @Override
            public void paint(Graphics g) {
                g.drawImage(bi, 0, 0, null);
            }
        };        
        this.add(layered);        
        this.validate();
        this.repaint();
    }