Swing组件默认渐变背景

6

有没有一种方法可以更改所有swing组件实例(例如JPanel)的默认背景绘制,以使用渐变背景进行绘制?还是我需要创建一个扩展JPanel的类来实现渐变绘制,并且在我的应用程序中到处使用它而不是JPanel?


你只需要对背景JPanel这样做,然后使所有其他JPanels变为非不透明的吗? - Hovercraft Full Of Eels
@HovercraftFullOfEels,这也是另一个选择。但如果我想将其扩展到其他组件,我认为我仍然需要扩展那些组件。 - Jeff Storey
@JeffStorey: 可能如此,但不一定。你可以通过一些简单的工厂方法创建你的 JPanels,并将 opaque 设置为 false,或者你可以递归遍历 GUI,将所有非基础 JPanels 都设置为不透明。 - Hovercraft Full Of Eels
对于JPanels(这实际上是我目前的做法),没错,但是假设我想将渐变应用于JButton。我必须为按钮做同样的事情。我希望有一种方法可以将渐变背景仅应用于组件X,但我不确定是否存在这样的方法。 - Jeff Storey
您可能可以通过创建自己的外观和感觉来实现这一点。不过我个人从未尝试过这样做。 - Hovercraft Full Of Eels
是的,我已经开始探索这个选项了,但由于我想要扩展标准 L&F,可能有点过度。我可能会坚持你的解决方案,将所有面板设置为不透明,并扩展需要使用渐变的面板。谢谢。如果您回答了那个,我会接受的。 - Jeff Storey
2个回答

3

在我看来,更容易的方法是继承 Swing 组件并重写其 paintComponent 方法以进行渐变绘制。然后,如你所说,可以在整个应用程序中使用此自定义组件。

使用 UI 属性可能会很棘手,因为它们在所有 LaF 上可能不一致。


那是我的最初想法。我不确定是否有更简单的方法来完成它。特别是如果我想将渐变应用于多个组件类型,我需要对所有组件进行子类化。 - Jeff Storey
@JeffStorey,如果是这样的话,或许继承JComponent会更好。 - Moonbeam
我不确定这对于多个组件类型会有什么帮助。比如说,如果我要更改按钮的背景,如何通过子类化JComponent来实现呢? - Jeff Storey

0

您的意图并不是完全清晰的。您是指通过 class(这样所有 JPanel 实例都遵循新的绘制方案),还是指一个容器中的 所有 组件(例如 Frame 中的所有内容)?

根据组件类别,有可能实现这一点,可以在外观和感觉上进行钩子操作,或者基于每个组件实例,使用 paintComponent() 方法,或者如果您需要替换现有组件的标准外观,但无法覆盖该方法,因为您无法控制它,则可以在组件创建后提供自己的 UI 类(请参阅 Component.setUI)。

除了覆盖 paintComponent 方法之外,其他方法都不容易实现。对于大多数应用程序来说,简单的方法是最好的 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接