Java 在AWT上绘制图像并初始化图形

Java 在AWT上绘制图像并初始化图形,java,graphics,Java,Graphics,我会先告诉你如果没问题的话我想做什么,因为我不确定我所奋斗的道路是实现我目标的最好方式 我有一个包含两个JPanel的JFrame。一个包含许多按钮(buttonPanel),另一个最初是空白的(displayPane)。当按下按钮时,displayPanel中显示的内容会发生变化。其工作方式是每次按下按钮都会创建一个扩展JPanel的新对象,然后将其添加到displayPane 因此,除了一个特殊的案例外,上述所有方法都很有效(尽管我承认这可能不是最好的方法) 在这种情况下,我需要创建一个JL

我会先告诉你如果没问题的话我想做什么,因为我不确定我所奋斗的道路是实现我目标的最好方式

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

因此,除了一个特殊的案例外,上述所有方法都很有效(尽管我承认这可能不是最好的方法)

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

现在,我的问题是这个。我知道绘制剪裁图像的唯一方法是通过
g=thingie.getGraphics()、g.setClip(Shape-Shape)、g.drawImage(各种)
。然而,所有这些都依赖于能够获得图形。但由于我首先组装对象,因此没有与JLayeredPane关联的图形对象(因为它未显示),因此getGraphics返回null,并且
g.setClip()
引发null指针异常

很明显,我不知何故在什么地方做错了。如果问题让人困惑,我们将不胜感激。我试图尽可能多地包含细节,现在我有点担心我把问题搞糊涂了。我将密切关注这一点,并在需要时予以澄清。

警告!:回答错误,请看下面的行 为什么不创建一个新的图形对象,在其上绘制,然后与该方法一起使用呢


这是正确的 如注释中所述,以前的解决方案是错误的,但可以使用双缓冲区完成,创建缓冲图像并在其上绘制,然后覆盖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();
    }
警告!:回答错误,请看下面的行 为什么不创建一个新的图形对象,在其上绘制,然后与该方法一起使用呢


这是正确的 如注释中所述,以前的解决方案是错误的,但可以使用双缓冲区完成,创建缓冲图像并在其上绘制,然后覆盖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();
    }

我不太明白。图形是抽象的。你是说把它分为子类吗?还是我疯了?我的错误是,无论如何,你可以创建一个图像对象并使用它的图形,但你必须覆盖你的jlayered窗格上的绘画方法。我在我的答案中添加了一个例子。很抱歉,这花了几天时间才返回。事实上,我是用一种稍微不同的方式来做的,因为抽绳看起来有点像软糖。我的并没有更好(在一个图层上画完整的图像,在更高的图层上画蒙版),但它在概念上感觉更清晰。谢谢你的帮助,弗雷德,我不能投你的票,因为我的名声太坏了。我不确定我能理解。图形是抽象的。你是说把它分为子类吗?还是我疯了?我的错误是,无论如何,你可以创建一个图像对象并使用它的图形,但你必须覆盖你的jlayered窗格上的绘画方法。我在我的答案中添加了一个例子。很抱歉,这花了几天时间才返回。事实上,我是用一种稍微不同的方式来做的,因为抽绳看起来有点像软糖。我的并没有更好(在一个图层上画完整的图像,在更高的图层上画蒙版),但它在概念上感觉更清晰。谢谢你的帮助,弗雷德,我不能投票支持你,因为我的名声太差了。