【问题标题】:How can I customize the render of JRadioButton?如何自定义 JRadioButton 的渲染?
【发布时间】:2011-03-20 08:39:06
【问题描述】:

我创建了一个 JRadioButton 子类,我在其中重写了 paintComponent 方法,如下所示:

@Override
protected void paintComponent(Graphics g) {
    g.drawImage(
        isSelected() ? 
           getCheckedImg() :
           getBasicImg()
    , 0, 0, this);
}

但似乎一旦按钮被绘制,那就是它永远使用的图像。 isSelected 测试似乎没有任何效果。图形是缓存的还是Java的东西?如何为我的自定义 JRadioButton 提供已选择和未选择的图像?我必须编写自定义 UI 吗?

【问题讨论】:

  • 如果你添加一个监听器并在每次切换按钮选择时调用 repaint() 会怎样?

标签: java swing awt


【解决方案1】:

即使在 Java swing 中,我通常也会覆盖 paint 而不是 paintComponent 以自定义外观。我相信默认的paint 会调用paintComponent,但前提是组件必须重新绘制。

【讨论】:

  • -1,自定义绘画应该在paintComponent()而不是paint()中完成。阅读自定义绘画的 Swing 教程部分:download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/…
  • 谢谢,我已经读过它了,之前已经读过好几遍了。但是,paint 的基本版本调用paintComponent 以及其他操作;当我不需要这些操作(这很常见)时,我对覆盖 paint 没有任何问题。你只是把“RTFM”穿在一件漂亮的衣服上。我有 RTFM,然后我有 RTFSourceCode,然后我为自己的项目做出了自己的合乎逻辑的决定。
  • 这对你来说可能没问题,但这个建议与 Swing 的设计使用方式背道而驰,因此你需要解释使用这种方法的后果/好处。
【解决方案2】:

为了保留功能,扩展BasicRadioButtonUI 并覆盖委托的paint() 方法并不难。您可以使用 setUI() 安装新 UI。

【讨论】:

    【解决方案3】:

    阅读 API。有如下方法:

    setIcon()
    setSelectedIcon()
    

    您可以使用其他工具而不是进行自定义绘画。

    【讨论】:

    • 这样可以保留模型的功能,而且更容易!
    • 我想我不明白你的要求。这两种方法的重点是用你想要的任何东西替换“单选按钮图标”。发布您的 SSCCE (sscce.org) 以显示问题。
    • 被否决是我的错。我不小心按错了按钮!该解决方案完全有效。它很容易实现,而且我不必为 UI 搞砸。谢谢!
    猜你喜欢
    • 2020-10-28
    • 1970-01-01
    • 2017-06-09
    • 2023-04-07
    • 2022-01-10
    • 2013-07-27
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多