当前位置: 首页 > 面试题库 >

在Java中使用super.paintComponent(g)或getGraphics()

能业
2023-03-14
问题内容

我对几件事有些困惑:

示例代码,显示了我的问题,这是无法编译的

// image
private BufferedImage image;
private Graphics2D graphic;
private changeImage;
. . .
//thread loop
while (running) {
   . . .
    render();
    Graphics showGraphic = getGraphics();
    showGraphic.drawImage(image, 0, 0, null);
    showGraphic.dispose();
    }
 public void render(){
     if(changeImage == 1)
     graphic.drawImage(ImageLoader.TREE, 0, 0, null);
     else if(changeImage == 2){
     graphic.drawImage(ImageLoader.HOUSE, 0, 0, null);
      . . .
     graphic.fillRect(50,60,30,40);
     }
}

我创建了一个全局对象, Graphic2D并在其中绘制了内容 render(),但我没有repaint()在游戏循环内调用
它,这样做是否是一种好习惯?

我应该repaint()在循环和paintComponent()函数内部使用吗?

另一件事,如何graphic.dispose()正常工作?,因为尝试删除此行代码,因此没有任何反应。

我了解java docs的dispose()的工作方式 但是我没有注意到dispose()与否的任何区别。

我的程序运行得很好,但是我有这个问题。


问题答案:

这样做是一种好习惯吗

不,这实际上非常可怕且容易出错。假设这是
Component#getGraphics方法。问题是Swing使用被动渲染算法,也就是说,Swing决定何时以及应重新绘画的对象,并且出于优化原因进行此操作。

这意味着更新不是定期的,这在制作动画时确实有帮助,并且可能由于多种原因随时发生,其中许多原因您根本无法控制。

由于这些原因,应该在一种绘画方法(最好paintComponentJComponent基于基础的绘画方法)内进行绘画。这样,当Swing决定进行重新绘制时,一个就知道并且可以相应地更新输出,而第二个就不会清除以前使用getGraphics它绘制的内容,这可能导致闪烁…

您还遇到了潜在的线程问题,因为您试图在Graphics上下文中绘制,所以事件调度线程可能不会结束,所有绘制都应在EDT上下文中完成。
(用于基于组件的绘画)

您可以尝试使用BufferedStrategy,这样可以直接控制绘画过程,但这将您限制在AWT库中。不知道这对您而言是好是坏。

另一件事,graphic.dispose()如何正常工作?,因为尝试删除此行代码,因此没有任何反应。

dispose基本上释放Graphics上下文可能拥有的任何本机资源。一般的经验法则,如果没有创建,就不要丢弃它。

因此,如果使用Graphics#createBufferedImage#createGraphics获取Graphics上下文,则dispose在完成操作后应调用。

在某些系统dispose上,调用Grpahics用于执行组件绘制(例如传递给paintComponent或从中获得的组件)的上下文getGraphcis可能会阻止进一步的内容被绘制。

同样,不处理Graphics您创建的上下文会导致内存泄漏,因为它们不会收集垃圾。



 类似资料:
  • 做什么(特别是当我们将它放在paintComponent()方法中时)?我很惊讶以前没有人问过这个问题。 我翻出我关于Java图形的学校笔记,它在这行代码上唯一提到的是。 然而,这几周我一直在练习和学习Java的paintComponent()方法。到目前为止,我还没有将这一行包含在我的代码中,而且一切似乎都运行得很好(到目前为止)。所以.. 问题: 它做什么? 何时需要使用它? 在paintCo

  • 问题内容: 有什么作用(特别是当我们将其放入paintComponent()方法中时)?令我惊讶的是,我之前没有人问过这个问题。 我在Java Graphics上挖了我的学校笔记,在这行代码中唯一提到的是。 但是,这几周来,我一直在练习和使用Java paintComponent()方法。到目前为止,我还没有将该行包含在我的代码中,并且一切似乎都运行良好(到目前为止)。所以.. 问题: 它有什么作

  • 当在子类中重写它时,调用油漆组件方法将其定义为超类的重要性是什么。我无法理解原因。例如:请参阅下面的代码以显示填充的弧:

  • 问题内容: Java开发受到压力的一个模因总是使用ArrayList而不是Vector。不推荐使用vector。可能是正确的,但是Vector和Hashtable具有同步的优点。 我正在使用面向大量并发的应用程序,使用像Vector一样同步的对象是否有益?看来他们有自己的位置? 问题答案: Vector和Hashtable的问题在于它们仅在本地同步。它们不会在并发应用程序中中断(就像在损坏的数据中

  • G2.DrawString(new Date().toString(),0,150); (我在内部类的paint方法中使用了g2(全局变量))。 非常感谢!

  • 问题内容: 在什么情况下,枚举比保证唯一元素的Collection(例如,java.util.Set的实现者)更合适? (这是我上一个问题的跟进) 问题答案: 基本上是在编译时就知道的一组定义明确的固定值。 您可以很容易地将枚举用作集合(通过EnumSet),它允许您定义行为,按名称引用元素,打开元素等。