【问题标题】:Updating JLabel icon messes up with the background更新 JLabel 图标与背景混淆
【发布时间】:2013-01-18 06:18:40
【问题描述】:

我已将容器 JPanel 的背景颜色设置为部分透明。我有一个带有透明背景的 PNG 图像的 JLabel。我还有另一个图像,当鼠标悬停在标签上时会显示。我使用以下来更改图标

private void settingsMouseEntered(java.awt.event.MouseEvent evt) {
    this.settings.setIcon(new ImageIcon(getClass().getResource("/Resources/settingsIconHover.png")));
}

private void settingsMouseExited(java.awt.event.MouseEvent evt) {
    this.settings.setIcon(new ImageIcon(getClass().getResource("/Resources/settingsIcon.png")));
}

每次更新图标时,它都会稍微改变不透明度。最终背景不再透明。

我已经用下面的代码设置了 JPanel 的背景

content.setBackground(new Color(74, 137, 227, 60));

JPanel 位于具有特定背景的 JFrame 中

setBackground(new Color(74, 137, 227, 80));

这是一张图片

怎么了?

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 这么少的代码很难说。重新验证容器并重新绘制可能会解决问题,但这只是一个猜测。在旁注中,不要在每次鼠标进入或存在时创建一个新的 ImageIcon 对象!将这两个图像存储为字段,并且只加载一次(例如在构造函数中)。
  • 部分透明的问题,JVM没有完全重绘屏幕上的脏区。
  • 感谢@HovercraftFullOfEels!我在上面的方法中添加了repaint(),它解决了这个问题。请发布它作为答案。也感谢@Dejan,我按照你所说的只加载图像一次。
  • 另外,确保所有容器的不透明度设置为 false(JPanel 的默认值为 true,这可能会导致绘制具有不完全不透明颜色/图标的伪像)

标签: java image swing background jpanel


【解决方案1】:

每次更新图标时都会稍微改变[半透明]......有什么问题?

平台具体实现Graphics2D的默认复合模式为AlphaComposite.SRC_OVER,可能会产生你描述的效果。由于对repaint() 的重复调用,一个类似的问题被检查here

【讨论】:

    【解决方案2】:

    请参阅Backgrounds With Transparency,了解可能发生的情况和一种可能的解决方案。

    【讨论】:

      【解决方案3】:

      当您将 alpha 颜色应用于这样的组件时

      content.setBackground(new Color(74, 137, 227, 60));
      

      setBackground(new Color(74, 137, 227, 80));
      

      您没有影响组件的 opacity 属性。这意味着重绘管理器不知道它需要重绘它下面的内容(因为就其而言,它们是不透明的)。

      尝试将面板也设置为透明,使用 JComponent#setOpaque 传递一个 false 值。

      然后阅读camickr提供的链接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-08
        相关资源
        最近更新 更多