如何在JavaSwing中为所有类型的组件设置UI?

如何在JavaSwing中为所有类型的组件设置UI?,java,swing,scrollbar,custom-component,Java,Swing,Scrollbar,Custom Component,我创建了自己的MyScrollbarUI类,以便在应用程序中具有自定义滚动条外观。现在我要做什么 scrollPane.getHorizontalScrollBar().setUI(new MyScrollbarUI()); scrollPane.getVerticalScrollBar().setUI(new MyScrollbarUI()); 在我使用的任何滚动窗格上 是否有可能告诉Swing它应该在任何滚动条上使用MyScrollbarUI。可能通过UIManager?扩展JScroll

我创建了自己的
MyScrollbarUI
类,以便在应用程序中具有自定义滚动条外观。现在我要做什么

scrollPane.getHorizontalScrollBar().setUI(new MyScrollbarUI());
scrollPane.getVerticalScrollBar().setUI(new MyScrollbarUI());
在我使用的任何
滚动窗格上


是否有可能告诉Swing它应该在任何滚动条上使用
MyScrollbarUI
。可能通过
UIManager

扩展JScrollPane创建新的滚动窗格组件,并告诉您的自定义滚动窗格使用mycrollbarui。然后修改所有代码以使用自定义ScrollPane而不是JScrollPane。

尝试将自定义UI类设置为的属性。默认情况下,它是
javax.swing.plaf.metal.MetalScrollPaneUI
将其更改为您的自定义类。

从技术上讲,它很容易告诉UIManager要使用哪个委托(正如@Harry Joy已经提到的),如

这将有效地为所有LAF安装相同的委托类,这可能会导致除扩展自定义ui类之外的所有LAF的视觉效果都不理想。严格来说,每个LAF需要一个自定义类

UIManager.put("ScrollBarUI", MyScrollbarUI.class.getName());
我们应该做到这一点


您需要在UI类中有一个
公共静态组件UI createUI(JComponent c)
方法,返回UI实例。

错误-swing设计用于支持可插拔的UI委托,无需为任何视图+1子类化以提及我经常忘记实现的方法:-)无需使用getDefaults,尽管如此。在这一点上我相信你(基本上在所有关于Swing的事情上)。我编辑了我的答案。
UIManager.put("ScrollBarUI", MyScrollbarUI.class.getName());