1

如果没问题,我将首先告诉你我想做什么,因为我不确定我挣扎的路线甚至是实现我目标的最佳方式。

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

因此,除了一种特殊情况外,以上所有内容都可以正常工作(尽管我坦率地承认这可能不是最好的方法)。

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

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

显然,我以某种方式和某处做错了。任何帮助将不胜感激,如果问题令人困惑,对不起。我试图包含尽可能多的细节,现在我有点担心我把这个问题弄混了。我会密切关注这一点,并在需要时进行澄清。

4

1 回答 1

1

警告!:错误答案,请参阅下面的行

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

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

这表明是正确的

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

    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();
    }
于 2012-09-03T15:04:26.617 回答