Название очень запутанное, я знаю. Я хотел создать свою собственную библиотеку пользовательского интерфейса в java, используя swing. Сначала я решил создать код UIButton.
(очень упрощенный):
class UIButton extends JButton {
int x = DEFAULT_X, y = DEFAULT_Y;
int w = DEFAULT_w, h = DEFAULT_H;
UIButton(){
super("Text Here");
super.setBounds(x,y,w,h);
}
void setPosition(int x, int y){
this.x = x;
this.y = y;
super.setBounds(x,y,w,h);
}
void setDimensions(int w, int h){
this.w = w;
this.h = h;
super.setBounds(x,y,w,h);
}
void enableMe(){
super.setVisible(false);
super.setEnabled(false);
super.setFocusable(false);
}
...
}
Затем я понял, что этот код будет повторяться, потому что каждому компоненту пользовательского интерфейса нужны setPosition, setDimensions и enableMe (), поэтому я создал класс UIComponent, но вы не можете написать class UIButton extends JButton, UIComponent {...}
:( Затем я создал интерфейс UIComponentInter, в котором я поместил все методы по умолчанию, которые отлично работали с методом enableMe (), но не для остальных. UIComponentInter (пришлось обходное решение если подкласс не является частью JComponent):
default void enableMe(){
if(!(this instanceof JComponent)) return;
JComponent component = (JComponent) this;
component.setVisible(true);
component.setEnabled(true);
component.setFocusable(true);
}
метод setPosition () требует переменных x и y, но каждая переменная в интерфейсе является final и c.
В настоящее время Я использую класс UIComponent для управления поведением, а класс UIButton действует как прокси для UIComponent, но мне все равно приходится копировать и вставлять много кода, чтобы добавить новые элементы пользовательского интерфейса.