Bal*_*der 3 java swing look-and-feel uimanager custom-component
我正在写一个 custom JComponent,它应该看起来不同,外观和感觉不同。我打算ComponentUi至少为WindowsLookAndFeel、MetalLookAndFeel和有不同的类MotifLookAndFeel。
现在,虽然这项任务看起来很简单,但我无法找到如何使用自定义ComponentUi类轻松扩展现有外观。
我将如何ComponentUi为不同的外观和感觉注册正确的?这可能吗?如果没有,为不同的外观和感觉编写自定义组件的首选方法是什么?
更具体地说,目前我正在JComponent#updateUI我的自定义组件中覆盖以设置不同的ComponentUi实例:
@Override
public void updateUI() {
LookAndFeel feel = UIManager.getLookAndFeel();
if (feel instanceof WindowsLookAndFeel) {
setUI(MyWindowsCustomUi.createUI(this));
} else if (feel instanceof MotifLookAndFeel) {
setUI(MyMotivCustomUi.createUI(this));
} else if (feel instanceof MetalLookAndFeel) {
setUI(MyMetalCustomUi.createUI(this));
} else{
setUI(MyBasicCustomUi.createUI(this));
}
}
Run Code Online (Sandbox Code Playgroud)
但这种方法似乎完全违背了观感的目的和用处。我希望能够将其更改为以下内容:
public void updateUI() {
setUI((MyCustomUi)UIManager.getUI(this));
}
Run Code Online (Sandbox Code Playgroud)
这应该MyCustomUi为当前的外观设置正确的子类。
我知道,我可以通过创建每个支持的自定义子类来轻松实现这一点,在 eg 期间LookAndFeel注册相应的子类- 但这不是我想要做的。ComponentUiBasicLookAndFeel#initComponentDefaults(UIDefaults)
如果您愿意与否 - 您必须以某种方式向 UIManager 注册您的自定义 UI,否则它怎么可能知道它们 ;-)
但是,您不需要的是受支持的 LAF 的自定义子类:您可以手动注册它们(并在 LAF 更改时更新注册,也就是说,您需要在 UIManager 上有一个 propertyChangeListener 才能在这种情况下收到通知一个案例)。
假设 JCustom 的 classID 为“CustomUI”,并且 ui 实现遵循通常的约定(即 BasicCustomUI、WindowsCustomUI ...),则注册将类似于:
String prefix = UIManager.getLookAndFeel().getID();
UIManager.getLookAndFeelDefaults().put("CustomUI", myUIPackage + "." + prefix + CustomUI);
Run Code Online (Sandbox Code Playgroud)
请注意,自定义 ui 需要一个返回 ui 实例的静态 createUI:
public static ComponentUI createUI(JComponent comp) {
return new BasicCustomUI();
}
Run Code Online (Sandbox Code Playgroud)
并且组件需要发布其uiClassID,查找并设置其ui:
@Override
public String getUIClassID() {
return "CustomUI";
}
@Override
public void updateUI() {
setUI(UIManager.getUI(this));
}
Run Code Online (Sandbox Code Playgroud)
使用 SwingX 的好处是提供了自动注册自定义组件的基础设施。您将需要一个额外的类 - CustomAddon - 它提供每个 LAF 配置,并且自定义组件必须贡献该插件:
// in JCustom
static {
LookAndFeelAddons.contribute(new CustomAddon());
}
// in CustomAddon
@Override
protected void addBasicDefaults(LookAndFeelAddons addon, DefaultsList defaults) {
super.addBasicDefaults(addon, defaults);
defaults.add("CustomUI",
"mypackage.BasicCustomUI");
}
@Override
protected void addMacDefaults(LookAndFeelAddons addon, DefaultsList defaults) {
super.addMacDefaults(addon, defaults);
defaults.add("CustomUI",
"mypackage.MacCustomUI");
}
//... similar methods for all supported LAFs
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1022 次 |
| 最近记录: |