Java 小程序 AWT-EventQueue-1 异常
我用 java 小程序编写了生命游戏的简单实现。 以下是 Applet 和 模型。
当我单击按钮获取下一次迭代时,会抛出这些异常。
Z:\GameOfLife>appletviewer driver.html
Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException:
65
at GameOfLifeApplet.mouseClicked(GameOfLifeApplet.java:63)
at java.awt.Component.processMouseEvent(Component.java:6219)
at java.awt.Component.processEvent(Component.java:5981)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4583)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre ad.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre ad.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
I wrote a simple implementation of the Game of life with java applets.
Here's is the source code for the Applet and the Model.
When I click the button to get the next iteration these Exceptions get thrown.
Z:\GameOfLife>appletviewer driver.html
Exception in thread "AWT-EventQueue-1" java.lang.ArrayIndexOutOfBoundsException:
65
at GameOfLifeApplet.mouseClicked(GameOfLifeApplet.java:63)
at java.awt.Component.processMouseEvent(Component.java:6219)
at java.awt.Component.processEvent(Component.java:5981)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4583)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4413)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre ad.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre ad.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
尝试使用此代码添加一次按钮,而不是每次调用
paint()
。请注意,如果您单击网格外部(而不是按钮上),此源仍然会抛出 AIOOBE,但这似乎是一个基本逻辑错误,一旦按钮修复,您应该进行调查。进一步提示
null
布局。自定义渲染区域不需要它,并且应该使用布局管理器来调整按钮的大小和位置(可能有一个边框将其填充)。更新
此代码实现了上面“使用布局”的第二个建议,但将其作为练习留给读者,以将组件更新为本世纪可能使用的组件(即 Swing)。
下面的源代码在某种意义上“作弊”,以自然大小显示 GUI。这在小程序中很难做到,因为大小是由 HTML 设置的。但是,将 GUI 放入基于 Swing 的
JOptionPane
中,只需几行代码即可将其显示在屏幕上,并按其自然大小排列。这是它在“自然大小”下的样子(我使用了一些数字,以使 GUI 更小)。
其他事项
Panel
。这解决了直接绘制到顶级容器的常见问题。它还允许在不同容器中轻松地重复使用相同的 GUI。在本例中,既是一个小程序,又是一个JOptionPane
对于“应用程序”(通常放在框架中)。现在它被称为“混合小程序/应用程序”(更容易测试)。Ecosystem
(耸耸肩)通知布局它喜欢的大小。这有助于我们避免需要设置任何东西的大小或边界。Try this code that adds the button once rather than every call to
paint()
. Note that this source still throws AIOOBE if you click outside the grid (and not on the button), but that seems like a basic logic error you should investigate once the button is fixed.Further tips
null
layouts. The custom rendered area does not need it, and the button should be sized and positioned using a layout manager (with maybe a border to pad it out).Update
This code implements the 2nd suggestion from above 'use layouts', but leaves it as an exercise for the reader to update the components to something that might be used in this millennium (i.e. Swing).
The source below 'cheats' in a sense to show the GUI at it's natural size. This is tricky to do in an applet, since the size is set by the HTML. But put the GUI into a Swing based
JOptionPane
and it can be put on-screen, packed to its natural size, in just a couple of lines of code.Here is what it looks like at the 'natural size' (I played with some numbers, to make the GUI smaller).
Other matters
Panel
. This gets around the common problems of painting directly to a top-level container. It also allows easy re-use of the same GUI in different containers. In this case both an applet, and for the 'application' (which would usually be put in a frame), aJOptionPane
. It is now what is known as a 'hybrid applet/application' (easier for testing).Ecosystem
(shrugs) informs the layout what size it prefers to be. This helps us to avoid needing to set the size or bounds of anything.首先,我认为您错误地读取了异常跟踪。该异常是
ArrayIndexOutOfBoundsException
,发生在GameOfLifeApplet.java
的第 63 行。您的应用程序是一个小程序,或者异常发生在线程AWT-EventQueue-1
上,这些都没有任何关系。根本原因是您没有正确同步模型和视图关于网格中有多少单元格的想法。至少,您应该考虑在访问数组元素之前检查用户是否实际单击了网格内部。
First, I think you're reading the exception trace wrong. The exception is an
ArrayIndexOutOfBoundsException
and occurs on line 63 ofGameOfLifeApplet.java
. That your app is an applet or that the exception occurs on the threadAWT-EventQueue-1
bears no relevance at all.The root cause is that you've not properly synchronized the model and view's idea of how many cells there are in your grid. At the least, you should consider checking that the user actually clicked inside the grid before accessing the array element.