如果可以的话,我会先告诉你我想做什么,因为我不确定我努力奋斗的路线是实现目标的最佳途径。
我有一个包含两个JPanel的JFrame。一个包含许多按钮(buttonPanel),另一个是最初的空白(displayPane)。按下按钮时,displayPanel中显示的内容会发生变化。这样做的方法是每次按一个按钮都会创建一个新对象,扩展JPanel,然后将其添加到displayPane
所以上述所有工作都很好并且花花公子(虽然我承认它可能不是最好的方法),除了一个特殊情况。
在这种特殊情况下,我需要创建一个JLayeredPanel,然后在其上绘制一个剪切图像。 JLayeredPanel因为我想在它上面绘制一些东西,因为我只想显示该区域的一部分(确切的部分传递给构造函数)。
现在,我遇到的问题是这个。我知道绘制剪裁图像的唯一方法是通过g=thingie.getGraphics(), g.setClip(Shape shape), g.drawImage(various)
。但是,所有这些都依赖于能够获得图形。但是因为我首先组装了对象,所以没有与JLayeredPane关联的图形对象(因为它没有显示)所以getGraphics返回null并且g.setClip()
抛出了空指针异常。
显然我在某种程度上和某个地方做错了。任何帮助将不胜感激,如果问题令人困惑,抱歉。我试图尽可能多地包含细节,现在我有点担心我已经弄糊涂了这个问题。我会密切关注这一点并在必要时澄清。
答案 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();
}