通常,当我调用getGraphics()时,即使设置了xxx.getGraphics(),它也会返回null。 xxx可见(正如谷歌搜索显示的那样...)调用getGraphics()返回null的任何替代方法
但这不起作用,这让我感到沮丧,因为在C-Sharp中做起来很简单容易。
有没有人知道更好的方式来做到这一点,而不是使用getGraphics()?
通常,当我调用getGraphics()时,即使设置了xxx.getGraphics(),它也会返回null。 xxx可见(正如谷歌搜索显示的那样...)调用getGraphics()返回null的任何替代方法
但这不起作用,这让我感到沮丧,因为在C-Sharp中做起来很简单容易。
有没有人知道更好的方式来做到这一点,而不是使用getGraphics()?
您通常不希望在Java Swing组件上使用getGraphics,因为如果该组件尚未渲染,并且即使该组件已被渲染并且Graphics对象返回不为null,它也将为null通常是一个短暂的对象,如果组件被重新绘制(一个超出你的控制范围的进程)将无法正常工作。
一个更好的选择是绘制一个JComponent的paintComponent方法,并使用传递给此方法的Graphics对象作为其参数。如果你需要绘制一些作为背景图片的东西,也可以看一看BufferedImage的绘图。当你这样做,在这里你将在图像上调用getGraphics()
(或createGraphics()
,如果你需要一个Graphics2D对象),在这里返回的对象将是稳定的。您仍然需要以某种方式显示该图像,或者作为JLabel显示的ImageIcon,或者通过调用paintComponent的Graphics参数上的Graphics#drawImage(....)
来显示在JComponent的paintComponent方法中的图像。
请勿使用getGraphics()。您所做的任何绘画都将是临时的,并且在下次Swing确定组件需要重新绘制时将会丢失。
改为替代JComponent或JPanel的paintComponent()
方法来执行自定义绘画。有关更多详细信息和示例,请参阅Custom Painting。
你能否给我们提供一个上下文?也许包括一个[sscce](http://www.sscce.org)展示你的问题。 – mre
如果您尝试自定义绘制组件的方式,请覆盖'paintComponent'并将您的绘图代码放在那里。 – lhballoti