【问题标题】:How to create a custom Swing Component [closed]如何创建自定义 Swing 组件 [关闭]
【发布时间】:2010-10-23 19:13:13
【问题描述】:

我一直想在 Java 中创建自定义组件,或自定义现有组件,但我的搜索从未产生任何有用的结果。所以我决定问问 StackOverflow 社区:

在哪里可以找到有关自定义 Java GUI 组件的一般信息?

当我指的是定制时,我不是在谈论改变颜色、字体等。我的意思是真的定制它们。以下是两个样机示例组件:

备注
我开始这个问题主要是为了找到如何创建上述两个自定义组件。但后来我意识到没有关于破解挥杆组件的普遍问题。所以我认为最好有一个资源列表。

如果您想知道模型中的两个组件是如何工作的,这里是:

一个定制的 JScrollPane,每个方向都有两个滚动条。每个滚动条可以有不同的作用。例如,外部的滚动正常,内部的以更像Picasa 的方式移动视图。实际上,我从谷歌群组here 得到了一个有效的(!)答案,但这只是代码。

第二个是自定义的 JComboBox,当弹出列表展开时,它的末尾有一个 JComponent。这可以是任何东西,从带有图标的简单 JLabel 到以某种方式操作列表的 JButton。

但这个问题与那些特定的组件无关。它是关于寻找资源(网站、书籍、文章等)来学习如何创建它们。

【问题讨论】:

  • 我刚刚注意到截图上写着“jbomponent”...:P

标签: java swing jcomponent


【解决方案1】:

这篇文章,How To Write a Custom Swing Component 应该很有帮助。它涵盖了复制具有离散步骤和连续范围的 Windows 滑块控件。

【讨论】:

  • 此链接已过期。虽然实际页面仍然存在,但您会发现页面中的图像和链接都丢失了。有人有更新的链接吗?另外,一般来说,在 SO 上,我们将链接中的相关内容准确地放在答案中,以解决链接过期的情况。
【解决方案2】:

我个人认为上述答案过于笼统或含糊。另外,由于有人不可避免地会像我一样碰到这个帖子,我不妨提供我发现的内容:

希望这会有所帮助...

【讨论】:

    【解决方案3】:

    JDK 是开源的。要了解如何编写 Swing 组件,没有比 Swing 组件的源代码更好的地方了。通常,当您创建自定义组件时,您会对以下一项或多项感兴趣:{交互语义、视觉表示、组合结构}

    从最简单的案例开始:

    被动组件:JLabel
    交互组件:JButton

    JLabel 将演示JComponent 的准系统扩展,用于自定义绘制组件;在这种情况下,它正在绘制“文本”字符串值作为其表示。

    JButton 除了绘制组件外,还将演示用于用户交互的准系统扩展。

    【讨论】:

    • 在阅读 Swing 代码时要牢记一些注意事项:其中有很多代码是为了向后兼容;大多数实际的图形代码都在 UI 类中; Swing 类已经“进化”,不一定代表最佳实践。
    • 组件代码的网址
    【解决方案4】:

    Filthy Rich Clients 是一本关于这个主题的优秀、可读性强的书。它更多的是关于改进 Swing 组件的外观和感觉,而不是创建全新的组件,但它确实深入到了 Swing 的核心并提供了许多实际示例。

    【讨论】:

    • 是的,我读过这本书。非常好的书,但正如你所说,它主要是关于改善外观和感觉。
    【解决方案5】:

    阅读Swing Hacks: Tips & Tools for Building Killer GUIs (Marinacci, Adamson)。恕我直言,一本有效使用 Swing 的必备书籍。

    【讨论】:

      【解决方案6】:

      这是一个非常开放的问题,简短的回答是您继承 JComponent 或其后代之一并添加您需要的功能。显然,根据您想要执行的操作,难度可能会有所不同。对于初学者,我建议您阅读 Sun 的 tutorial on using Swing components,其中有关于如何使用 scroll panes 和 popup menus 的示例。通读这些内容并进行实验后,您可能会遇到更具体的问题,人们更容易提供经过深思熟虑的答案。

      如果您的模型中的两个组件都是您想要实现的,那么让我们更好地了解您希望它们如何运作将会产生更好的答案。

      【讨论】:

      • 我已经阅读了 Java 教程(并且在谈到 Swing 时总是这样做),但它并没有达到我需要的深度。
      • 你能更具体地解释一下你需要什么吗?您是想具体了解如何实现您在问题中模拟的功能,还是该问题旨在更笼统?
      猜你喜欢
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      相关资源
      最近更新 更多