Основываясь на моем опыте, ответ на вопрос в заголовке - громкое «НЕТ!!!», что я не могу поверить, чтобы быть правдой ... но по моему опыту. Я создал различные интерфейсы типов свойств, имеющие 3 метода, например: getColor(), setColor(Paint c) и ObjectProperty colorProperty(). Методы get()/set() реализованы в интерфейсе с модификатором default
. Обычно это работает нормально, за исключением случаев, связанных с Scene Builder и FXML. В Scene Builder вышеуказанное свойство вообще не отображается, если только реализации в интерфейсе не переопределены в классе, который реализует интерфейс, что противоречит самой цели использования методов по умолчанию, ... верно? С FXML, использующим указанное выше свойство, выдается PropertyNotFoundException
для свойств, реализованных только в интерфейсе (без вышеупомянутого переопределения).
Образец кода:
public interface TestInterface {
ObjectProperty<Paint> colorProperty();
default Paint getColor() {return colorProperty().get();}
default void setColor(Paint c) {colorProperty().set(c);}
}
public class TestClass implements TestInterface {
private ObjectProperty<Paint> color;
public ObjectProperty<Paint> colorProperty() {
if (color == null)
color = new SimpleObjectProperty<>(this, "color", Color.GREEN);
return color;
}
}
Вот фрагмент трассировки ошибки, созданный при попытке запустить тестовое приложение, содержащее файл FXML, который пытается установить свойство с именем PressedColor, которое объявляется и реализуется так же, как и 'color' в приведенном выше примере кода:
javafx.fxml.LoadException:
...
Caused by: com.sun.javafx.fxml.PropertyNotFoundException: Property "pressedColor" does not exist or is read-only.
Вот оскорбительный фрагмент из файла FXML:
<RectangleButton pressedColor="#ff6e6e">
Был бы признателен за любое руководство. Спасибо!