Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在Java中使用图形绘制而不使用paintComponent?_Java_Swing_Graphics_Paintcomponent_Graphics2d - Fatal编程技术网

是否可以在Java中使用图形绘制而不使用paintComponent?

是否可以在Java中使用图形绘制而不使用paintComponent?,java,swing,graphics,paintcomponent,graphics2d,Java,Swing,Graphics,Paintcomponent,Graphics2d,我想访问Graphics类来绘制一个矩形,但不需要调用paintComponent方法。有可能吗?应始终使用绘画方法进行绘画 最常见的方法是在组件的paintComponent(…)方法中进行自定义绘制 另一种方法是使用JLayer类“装饰”组件,并在JLayer的paint(…)方法中实现绘制。阅读Swing教程中关于的部分以获取更多信息和示例。是的,这是可能的,就像在缓冲区图像中绘制一样(通过调用getGraphics()方法直接使用Graphics对象) 但是,与buffereImage的

我想访问Graphics类来绘制一个矩形,但不需要调用paintComponent方法。有可能吗?

应始终使用绘画方法进行绘画

最常见的方法是在组件的
paintComponent(…)
方法中进行自定义绘制


另一种方法是使用
JLayer
类“装饰”组件,并在JLayer的
paint(…)
方法中实现绘制。阅读Swing教程中关于的部分以获取更多信息和示例。

是的,这是可能的,就像在
缓冲区图像中绘制一样(通过调用
getGraphics()
方法直接使用
Graphics
对象)

但是,与
buffereImage
的情况不同,对组件执行此操作可能会导致混乱。原因是底层AWT/Swing代码期望组件自行绘制(请参见
component.paint
JComponent.paintComponent
),而底层AWT/Swing代码则会考虑何时需要进行此渲染(例如滚动、调整大小等)

因此,如果您从组件外部绘制,AWT/Swing在任何时候决定“好吧,有一些新的绘制/重新绘制工作要做”,它将调用“标准方法”,期望您的绘制代码在那里。
当您在外部绘制时,如果您没有做出特殊安排以获得“需要重新绘制”的通知在这种情况下,部分或整个“从外面画”都会被涂上或根本不涂,或各种各样的乱七八糟的情况

换句话说,如果从外部绘制,则不仅需要编写绘制代码,还需要:

  • 重新实现AWT/Swing已经实现的代码堆,它处理组件需要(重新)绘制的情况
  • 以某种方式禁用绘画的AWT/Swing“本机”处理
  • 请放心,你不会想要的(即使你认为你想要)


    注:如果你能更好地描述你为什么需要这样做,你可能会得到更多有用的建议,告诉你如何以正确的方式去做。

    你的问题实际上可能是一个问题,当最好的解决方案是使用完全不同的方法时,你会问“我该如何解决这个代码问题”。考虑告诉我们你想解决的总体问题,而不是你现在试图解决的问题。例如,为什么要避免使用paintComponent?你试过什么?什么不起作用?例如,是的,可以通过调用
    getGraphics()
    并使用它进行绘图来获取组件的图形上下文对象,但这样做可能会创建不稳定的图像并引发NullPointerException,因为以这种方式获取的图形对象是不持久的。此外,不能调用paintComponent()方法,对吗?