gpt4 book ai didi

java - 使用自定义 JComponents 扩展现有的 Swing 外观

转载 作者:行者123 更新时间:2023-11-29 03:21:42 25 4
gpt4 key购买 nike

我正在编写一个自定义的 JComponent,对于不同的外观和感觉,它的外观应该有所不同。我打算至少为 WindowsLookAndFeelMetalLookAndFeelMotifLookAndFeel 使用不同的 ComponentUi 类。

现在,虽然这项任务看起来很简单,但我无法找到如何使用我的自定义 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));
}
}

但这种方法似乎完全违背了外观的目的和实用性。我希望能够将其更改为以下内容:

public void updateUI() {
setUI((MyCustomUi)UIManager.getUI(this));
}

这应该为当前的外观设置正确的 MyCustomUi 子类。

我知道,我可以通过为每个支持的 LookAndFeel 创建自定义子类来轻松实现这一点,这些子类在例如期间注册相应的 ComponentUi BasicLookAndFeel#initComponentDefaults(UIDefaults) - 但这不是我想要做的。

最佳答案

无论您是否愿意,您必须以某种方式向 UIManager 注册您的自定义 UI,否则它怎么知道这些 ;-)

不过,您不需要的是受支持的 LAF 的自定义子类:您可以手动注册它们(并在 LAF 更改时更新注册,也就是说,您需要 UIManager 上的 propertyChangeListener在这种情况下通知)。

假设一个 JCustom 的类 ID 为“CustomUI”并且 ui 实现遵循通常的约定(即 BasicCustomUI、WindowsCustomUI ...),注册将类似于:

 String prefix = UIManager.getLookAndFeel().getID();
UIManager.getLookAndFeelDefaults().put("CustomUI", myUIPackage + "." + prefix + CustomUI);

请注意,自定义 ui 需要一个返回 ui 实例的静态 createUI:

 public static ComponentUI createUI(JComponent comp) {
return new BasicCustomUI();
}

并且组件需要发布它的 uiClassID,查找并设置它的 ui:

@Override
public String getUIClassID() {
return "CustomUI";
}

@Override
public void updateUI() {
setUI(UIManager.getUI(this));
}

使用 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

关于java - 使用自定义 JComponents 扩展现有的 Swing 外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23213678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com