【问题标题】:JPanels, Listeners and ThreadsJPanel、监听器和线程
【发布时间】:2011-02-28 02:36:31
【问题描述】:

对于一个学校项目,我正在用 JAVA 编写 BlackJack 纸牌游戏。

在程序中执行几个步骤后,我的整个计算机系统变慢/卡顿,并且 JFrame 中的某些区域变黑。似乎没有重新粉刷。

我会用文字告诉你一些程序细节,而不是提交代码。

我已经对几乎每个 GUI 组件进行了广泛的扩展,以使其具有我想要的外观和感觉。几乎我使用的每个 JComponent 子组件都使用自定义图像背景和适用的抗锯齿功能重写了它的paintComponent。

在我的(自定义)JFrame 中,我加载了 JPanel 的扩展版本。此面板包含该屏幕的所有 GUI 组件。当我想切换屏幕(转到程序的不同部分)时,我切换到 JPanel 的另一个扩展版本。我通过从 JFrame 中删除所有元素并添加新面板来做到这一点。这些不同的面板实现了 ActionListeners 和 FocusListeners。

此时我的想法倾向于线程处理问题。我目前的理论是这样的:当一个面板被构建以在 JFrame 中显示时(每个面板都位于程序中的不同阶段),之前构建的面板并没有真正“销毁”,并且这些面板的侦听器保持活动状态。

我对你们的问题是,这个理论是否站得住脚......在那种情况下,有没有办法“杀死”这些小组或至少停止倾听?

如果我的理论没有意义,还有什么可能导致这些症状?会不会是对paintComponent 方法的广泛覆盖?

任何想法都会得到高度评价!

问候威尔科

【问题讨论】:

  • 没有看到代码,我真的怀疑有人能帮助你。一件事——我不明白你为什么要从旧的 JPanel 中删除所有组件——这不是必需的。你的内存不足了吗?您描述的行为听起来很可能。

标签: java multithreading listener jframe jpanel


【解决方案1】:

当一个面板被构建以在 JFrame 中显示时(每个面板在程序中的不同阶段),之前构建的面板并没有真正“销毁”,并且这些面板的监听器保持活动状态。

没有。事件仅被分派给具有焦点的组件。如果组件没有焦点,则不会收到系统生成的事件,如 KeyEvents 和 MouseEvents。因此,如果面板不可见,则它不会接收事件。

我切换到 JPanel 的另一个扩展版本。为此,我从 JFrame 中删除所有元素并添加新面板。

这不是最好的设计。最好使用专为此目的设计的Card Layout

我使用的几乎每个 JComponent 子组件都使用自定义图像背景和适用的抗锯齿功能重写了它的paintComponent

那么您的自定义绘画可能有问题。如果只使用标准组件而不使用自定义绘制会发生什么?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-06
    • 2011-06-14
    • 2012-09-11
    • 1970-01-01
    • 2012-02-03
    • 2013-07-26
    • 2012-06-02
    • 2015-02-04
    相关资源
    最近更新 更多