我对几件事有些困惑:
示例代码,显示了我的问题,这是无法编译的
// 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决定何时以及应重新绘画的对象,并且出于优化原因进行此操作。
这意味着更新不是定期的,这在制作动画时确实有帮助,并且可能由于多种原因随时发生,其中许多原因您根本无法控制。
由于这些原因,应该在一种绘画方法(最好paintComponent
是JComponent
基于基础的绘画方法)内进行绘画。这样,当Swing决定进行重新绘制时,一个就知道并且可以相应地更新输出,而第二个就不会清除以前使用getGraphics
它绘制的内容,这可能导致闪烁…
您还遇到了潜在的线程问题,因为您试图在Graphics
上下文中绘制,所以事件调度线程可能不会结束,所有绘制都应在EDT上下文中完成。
(用于基于组件的绘画)
您可以尝试使用BufferedStrategy
,这样可以直接控制绘画过程,但这将您限制在AWT库中。不知道这对您而言是好是坏。
另一件事,graphic.dispose()如何正常工作?,因为尝试删除此行代码,因此没有任何反应。
dispose
基本上释放Graphics
上下文可能拥有的任何本机资源。一般的经验法则,如果没有创建,就不要丢弃它。
因此,如果使用Graphics#create
或BufferedImage#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),它允许您定义行为,按名称引用元素,打开元素等。