2016-10-01 68 views
-2

我想访问Graphics类来绘制一个矩形,但是想要这样做,而不必调用paintComponent方法。可能吗?用没有paintComponent的Graphics可以绘制Java吗?

+3

您的问题实际上可能是一个[XY问题](http://mywiki.wooledge.org/XyProblem),当您最好的解决方案是完全使用不同的方法时,您会问“如何解决此代码问题” 。考虑告诉我们你想要解决的总体问题,而不是你目前如何解决问题。例如,*为什么*你想避免使用paintComponent?你有什么尝试?什么不工作? –

+2

例如,是的,可以通过调用getGraphics()来绘制一个组件的Graphics上下文对象,然后使用该对象进行绘制,但这样做可能会产生不稳定的图像并抛出NullPointerExceptions,因为以这种方式获取的Graphics对象不是耐用。 –

+0

此外,一个不调用paintComponent()方法,对吧? –

回答

3

绘画应始终以绘画方式完成。

最常见的方法是在组件的paintComponent(...)方法中执行自定义绘画。

另一种方法是使用JLayer类“装饰”组件,并在JLayer的paint(...)方法中实施绘画。请阅读Decorating Components Using the JLayer Class上的Swing教程部分以获取更多信息和示例。

3

是的,可以用相同的方式绘制BufferedImage(通过调用getGraphics()方法直接使用Graphics对象)。

但是,与BufferedImage的情况不同,对于组件这样做可能会造成混乱。原因是底层AWT/Swing代码期望组件自己绘制(参见Component.paintJComponent.paintComponent),而当此渲染需要发生时,它(底层的AWT/Swing代码)将会处理大约(例如滚动,调整大小等)。因此,如果你从组件的外部绘画,AWT/Swing在任何时候都决定“好吧,有一些新的绘画/重绘要完成”,它会调用“标准方法”,期望你绘图代码在那里。
当你在外部画画时,如果你没有特别的安排来通知“需要重新绘画”的情况,部分或整个“从外部画”将被涂上或不涂上所有或全部有种不同的凌乱情况。

换句话说,如果你画外之外,你需要编写不仅不画中的代码,也:

  1. 的代码重新实现堆已被执行AWT/Swing,它处理组件需要(重新)绘制的情况。
  2. 以某种方式禁用AWT/Swing“原生”处理绘画。

请放心,你不想那(即使你认为你这样做)。

PS。如果你更好地描述为什么你需要这样做,你可能会得到更多有用的建议,以便如何正确地做到这一点。

相关问题