绘制时,对象不会出现在java小程序中。我应该如何正确使用AWT中的绘画/重绘方法?
我有一个小程序界面,可以在屏幕上画一个球,当按下run按钮时,它会从边缘反弹。还有其他功能,但它们需要第一个功能才能工作。当前按run时,不会发生任何事情。我认为我画的对象不对。我已经输入了System.err.println()
语句,并检查控制台,当单击按钮时,程序确实会转到正确的方法。我只是不知道应该绘制对象的方法有什么问题
代码将近500行,但如果需要的话,我会把它粘贴到这个主体中。这是:http://ideone.com/JL0B2
# 1 楼答案
首先,您必须覆盖
drawingpanel
的绘制:这是绘制圆的地方。当前,该圆仅在按下“运行”按钮时出现,因为它被绘制在组件上在正常绘制期间,将绘制小程序区域(这是当前
paint
的工作区域),并在已绘制的点上绘制添加的所有组件在程序开始时
dot
是null
,因此paint无法正确绘制它-它会引发NullPointerException您不必“缓存”图形实例:始终使用paint中提供给您的图形
如果希望圆移动,则必须创建另一个线程,以便它更新值,然后计划重新绘制
drawingpanel
您不必重新绘制整个applet,只需重新绘制
drawingpanel
如果你仍然需要帮助,请在评论中询问他们
编辑:
这是你的
drawingpanel
画点的地方:并且
Bounce
小程序不会重写paint()
方法要实现动画,请将^{} 接口添加到
implements
部分添加另一个字段:
现在让我们实现简单的动画:
最后一个细节是动作处理程序:
下面是它的工作原理。您的实现在操作处理程序中启动了
run()
,并且没有将控件返回给EDT,因此您的应用程序出现挂起:它停止处理消息现在,当单击Run按钮时,状态字段
running
被反转,然后创建一个新线程(如果它尚未启动)。线程执行run()
方法。因此while
体中的操作被执行,直到running
变成false
drawingpanel
上绘制方法调用repaint()
。当消息队列为空时,系统将调用其paint
方法重新绘制面板李>Thread.sleep(500)
停止执行500毫秒。数字越小,圆点移动越快。这里的值在某种程度上取决于速度永远不要使用loop实现暂停:您只是在浪费处理器时间而没有任何收益,并且无法预测需要多长时间李>top
和left
坐标,使其移动到窗口的左上角李>值得注意的是
running
被声明为volatile
,因为该字段是从多个线程访问的,没有其他同步手段。如果它不在那里,运行的动画可能看不到动作处理程序中EDT对它的修改