Я пытаюсь создать набор связанных классов в JavaFX.
У меня есть объект класса Board, который создает некоторые объекты класса Box. Внутри класса Box я создаю несколько объектов класса Button.
Когда я нажимаю кнопку, я хочу выполнить триггер метода Box.
Внутри метода триггера Box, Я хочу, чтобы выполнение метода вычисления Board.
Если метод расчета возвращает значение true, тогда кнопка меняет свой цвет, иначе поле, содержащее кнопку, меняет свой цвет.
Первая идея, которую мне пришлось реализовать, - это использовать какой-то обратный вызов, передаваемый с платы на ящик и с ящика на кнопку.
Затем мне понадобилась еще одна необходимость: повторить этот механизм для другой функции ( если кнопка нажата правой кнопкой, если метод board_shape для Board возвращает true, кнопка становится кругом, в противном случае Box становится кругом). Поэтому я добавил еще один набор обратных вызовов.
В любом случае это кажется мне запахом кода, потому что для добавления второй функции я изменил все интерфейсы и все классы.
Есть ли другой способ сделать это в сферах GUI?
Спасибо
Вот это MRE. Поведение глупое, но мои вопросы таковы:
1) это правильный способ общения между GUI элементами?
2) что если мне нужно добавить больше интерфейсов связи между детьми а родители? У меня будут очень длинные конструкторы с большим количеством интерфейсов ... мне кажется, что это пахнет кодом ...
public interface Triggerable {
boolean trigger(int size);
}
public class MyButton extends Button {
Triggerable method;
int buttonSize;
String buttonName;
public MyButton(String name, int size, Triggerable t) {
super(name);
buttonName = name;
this.setMinSize(100, 30);
this.setOnMouseClicked(e -> MouseClickedAction(e));
buttonSize = size;
method = t;
}
void MouseClickedAction(MouseEvent e) {
if(method.trigger(buttonSize) == true ) {
System.out.println(buttonName + " triggered.");
}
}
}
public interface Calculable {
boolean calculate(int totalSize);
}
public class Box extends VBox {
String boxName;
int numberOfButtons = 3;
int boxSize;
Calculable method;
public Box (String name, int size, Calculable m) {
boxName = name;
for ( int i = 0; i < numberOfButtons; i++ ) {
this.getChildren().add(new MyButton("Button" + i + boxName , i, block -> trigger(block)));
}
boxSize = size;
method = m;
}
public boolean trigger(int buttonSize) {
if(method.calculate(boxSize+buttonSize) == true) {
System.out.println( boxName + " triggered.");
return false;
} else {
return true;
}
}
}
public class Board extends HBox {
String boardName;
int numberOfBoxes = 3;
int boardThreshold = 2;
public Board (String name) {
boardName = name;
for ( int i = 0; i < numberOfBoxes; i++ ) {
this.getChildren().add(new Box("Box" + i , i, block -> calculate(block) ));
}
}
public boolean calculate(int totalSize) {
if(totalSize > boardThreshold) {
return true;
} else {
return false;
}
}
}