【问题标题】:JLabel with Image won't erase from the screen带有图像的 JLabel 不会从屏幕上删除
【发布时间】:2014-01-01 11:59:59
【问题描述】:

我有一个 Jlabels 数组,每个都有一个 imageIcon 附加到它上面。附件发生在构造函数之外,在一个被多次调用的方法中,在方法结束时我使用 repaint()。

问题是,在绘制了某个 Jlabel 之后,我无法让他“取消绘制,即使我将 Jlabel(或图像)更改为 null。似乎只是留在那里。

我尝试重新绘制,重置背景颜色并重新验证,但似乎没有完成这项工作。

有什么想法吗?

编辑:我尝试了以下(在 edt 内),它似乎只更改了数组上的最后一个 JLable:

for (int j = 0;j<playerCards.length;j++){
    remove(playerCards[j]);
}

【问题讨论】:

  • 你的代码是错误的,因为你没有发布你的SSCCE来证明我们无法帮助的问题。 setIcon() 方法将起作用。您甚至不需要使用 repaint(),因为标签足够聪明,可以在其属性之一发生更改时重新绘制自身。
  • 您是否在父容器上使用了remove()?我不知道将JLabel 更改为null 是什么意思;例如,如果你说JLabel[] arr; 和后来的arr[i] = null;,这对GUI 没有影响(我不知道有任何Swing 组件会关心你的JLabel[] 数组)。

标签: java swing jlabel imageicon


【解决方案1】:

尝试将您的 UI 操作移至 EDT 线程。不让它们在那里可能会导致不可预知的结果。

EDT - 事件调度线程

您应该使用 EDT 线程对 GUI 进行更改,以便这是唯一对其进行更改的线程。

    SwingUtilities.invokeLater( 
        new Runnable() {
            public void run() {
                //UI changes here
            }
        }
    );

【讨论】:

  • 即使我在主线程上完成所有操作,是否有必要?
  • 是的,因为由您自己以外的任何其他线程完成的任何其他更新(包括可能正在做您不知道的事情的 EDT 的更新)将来自第二个线程,所以最好只也在该线程中进行所有 UI 调整。
  • @SaharZehavi,定义“主线程”。如果您从侦听器执行代码,则该代码会自动在 EDT 上执行。如果要创建自定义线程,则需要使用 invokeLater()。您的问题非常模糊,很难回答,这就是为什么您需要发布 SSCCE。
【解决方案2】:

尝试使用

SwingUtilities.updateComponentTreeUI(YOUR_OBJECT_CONTAINER);

其中 YOUR_OBJECT_CONTAINER 是扩展 JComponent 的 java 对象,其中包含要删除的 JLabel。

【讨论】:

  • -1,这不是一个合适的建议。该方法用于 LAF 更改。 Swing 组件非常聪明,可以在属性更改时重新绘制自己。
猜你喜欢
  • 1970-01-01
  • 2016-04-07
  • 2022-01-16
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多