gpt4 book ai didi

java - 如何确定自定义组件的正确 UI 实现

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:51:38 25 4
gpt4 key购买 nike

我正在创建一个具有自己的自定义 UI 的自定义组件。问题How to create a custom Swing Component为开发组件提供了良好的开端,但我一直未能找到将自定义组件与其 UI 连接起来的好方法。

How to Write a Custom Swing Component中的代码很好,但是 JFlexiSlider.updateUI 的实现硬编码了 UI 以使用 BasicFlexiSliderUI:

public void updateUI() {
if (UIManager.get(getUIClassID()) != null) {
setUI((FlexiSliderUI) UIManager.getUI(this));
} else {
setUI(new BasicFlexiSliderUI());
}
}

标准 Swing 组件实现 updateUI 以直接从 UIManager.get(this) 简单地设置 UI。从 UIClassID 到实际实现的映射在 BasicLookAndFeel 和子类中。

在我的例子中,我不想创建新的外观和感觉,我应该在哪里设置从我的 UIClassID 到实际实现的默认映射?它似乎应该在组件类之外,但需要在首次使用自定义组件之前将其添加到 UIDefaults 对象。

最佳答案

重要的合作者:

  • 自定义组件必须报告唯一的 uiClassID(在 getUIClassID 中)
  • 自定义用户界面代理
  • UIManager 是在实例化组件之前将自定义 uiClassId 映射到 ui 委托(delegate)类(预期用于自定义组件)的地方

在代码中是这样的:

/**
* The custom component
*/
public class Block extends JComponent {

private final static String ID = "BlockUI";

public Block(Color color) {
// configure
setBackground(color);
// install ui
updateUI();
}


@Override
public void updateUI() {
// ask the ui manager for an appropriate ui and set it
setUI(UIManager.getUI(this));
}

/**
* Implemented to return a unique component class identifier
*/
@Override
public String getUIClassID() {
return ID;
}

}

/**
* For each supported LAF, a laf-specific implementation
*/
public class BasicBlockUI extends ComponentUI {

public static ComponentUI createUI(JComponent c) {
return new BasicBlockUI();
}

@Override
public void paint(Graphics g, JComponent c) {
g.setColor(c.getBackground());
g.fillRect(10,10, c.getWidth()- 20, c.getHeight()-20);
}

}

// usage

//let the ui manager know of our component
// the value must be the fully qualified classname
UIManager.put("BlockUI", "org.jdesktop.swingx.plaf.BasicBlockUI");

JXFrame frame = new JXFrame("custom box", true);
Block block = new Block(Color.RED);
frame.add(block);
frame.setSize(200, 200);
frame.setVisible(true);

如果您想支持多个 LAF,您可能会查看最近的 QA which illustrates the SwingX插件自定义组件的机制。

关于java - 如何确定自定义组件的正确 UI 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17798631/

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