Я пишу пользовательский 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));
}
}
Но этот подход, кажется, полностью противоречит цели и полезности внешнего вида. Я хотел бы иметь возможность изменить это на следующее:
public void updateUI() {
setUI((MyCustomUi)UIManager.getUI(this));
}
И это должно установить правильный подкласс MyCustomUi
для текущего внешнего вида.
Я знаю, что мог бы легко добиться этого, создав пользовательские подклассы каждого поддерживаемого LookAndFeel
, которые регистрируют соответствующий ComponentUi
, например, во время. BasicLookAndFeel#initComponentDefaults(UIDefaults)
- но это не то, чем я хочу заниматься.