2011-11-18 65 views
6

通常,当我调用getGraphics()时,即使设置了xxx.getGraphics(),它也会返回null。 xxx可见(正如谷歌搜索显示的那样...)调用getGraphics()返回null的任何替代方法

但这不起作用,这让我感到沮丧,因为在C-Sharp中做起来很简单容易。

有没有人知道更好的方式来做到这一点,而不是使用getGraphics()?

+3

你能否给我们提供一个上下文?也许包括一个[sscce](http://www.sscce.org)展示你的问题。 – mre

+1

如果您尝试自定义绘制组件的方式,请覆盖'paintComponent'并将您的绘图代码放在那里。 – lhballoti

回答

11

您通常不希望在Java Swing组件上使用getGraphics,因为如果该组件尚未渲染,并且即使该组件已被渲染并且Graphics对象返回不为null,它也将为null通常是一个短暂的对象,如果组件被重新绘制(一个超出你的控制范围的进程)将无法正常工作。

一个更好的选择是绘制一个JComponent的paintComponent方法,并使用传递给此方法的Graphics对象作为其参数。如果你需要绘制一些作为背景图片的东西,也可以看一看BufferedImage的绘图。当你这样做,在这里你在图像上调用getGraphics()(或createGraphics(),如果你需要一个Graphics2D对象),在这里返回的对象将是稳定的。您仍然需要以某种方式显示该图像,或者作为JLabel显示的ImageIcon,或者通过调用paintComponent的Graphics参数上的Graphics#drawImage(....)来显示在JComponent的paintComponent方法中的图像。

12

请勿使用getGraphics()。您所做的任何绘画都将是临时的,并且在下次Swing确定组件需要重新绘制时将会丢失。

改为替代JComponent或JPanel的paintComponent()方法来执行自定义绘画。有关更多详细信息和示例,请参阅Custom Painting