3

我正在使用自己的自定义 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). UIClassID从到实际实现的映射在BasicLookAndFeel子类中。

在我的情况下,我不想创建新的外观和感觉,我应该在哪里设置从我UIClassID的到实际实现的默认映射?看起来它应该在组件类之外,但它需要UIDefaults在第一次使用自定义组件之前添加到对象中。

4

2 回答 2

3

主要合作者:

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

在代码中类似于:

/**
 * 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,该 QA 说明了将 SwingX机制插入自定义组件。

于 2013-07-23T14:21:24.723 回答
0

您可以使用setUI来设置组件的 UI。

于 2013-07-23T00:07:54.930 回答