WedX - журнал о программировании и компьютерных науках

Распознаются ли методы по умолчанию FXML и/или Scene Builder?

Основываясь на моем опыте, ответ на вопрос в заголовке - громкое «НЕТ!!!», что я не могу поверить, чтобы быть правдой ... но по моему опыту. Я создал различные интерфейсы типов свойств, имеющие 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">

Был бы признателен за любое руководство. Спасибо!

01.11.2016

  • Можете ли вы опубликовать код, который показывает, что это происходит? 01.11.2016
  • Повторюсь, методы по умолчанию прекрасно работают вне контекста FXML и/или Scene Builder. Например, если экземпляр TestClass будет объявлен в другом классе, этот другой класс сможет получить доступ к значению цвета для TestClass, просто вызвав методы по умолчанию, реализованные в интерфейсе — этого и следовало ожидать. Что необычно, так это то, что ожидаемое поведение не работает с FXML и/или Scene Builder, если только TestClass не переопределяет методы по умолчанию, что противоречит их цели, ... верно? .. или я что-то пропустил? Спасибо! 01.11.2016
  • Можете ли вы также опубликовать некоторый FXML, показывающий, что вы ожидаете от работы, но не работает? 01.11.2016
  • Вот фрагмент трассировки ошибки, созданный при попытке запустить тестовое приложение, включающее файл FXML, который пытается установить свойство с именем PressedColor, которое объявляется и реализуется так же, как и 'color' в приведенном выше примере кода: javafx.fxml. LoadException: ... ... ... Причина: com.sun.javafx.fxml.PropertyNotFoundException: свойство PressColor не существует или доступно только для чтения. Вот оскорбительный фрагмент из файла FXML: ‹RectangleButton pressColor=#ff6e6e› 01.11.2016
  • @James_D - Спасибо за ваш вклад, но, к сожалению, я отказываюсь от stackoverflow. Я потратил больше времени, пытаясь разобраться в функциях редактирования, чем задавая вопрос — это происходит не в первый раз — и это просто не стоит горя и разочарования. Я уверен, что где-то есть четкое описание того, как использовать эти функции, но если так, то — по крайней мере, для этого пользователя — они очень хорошо спрятаны. 01.11.2016
  • Хм. Я могу воссоздать это. Вероятно, код загрузчика FXML для поиска установщиков свойств был написан до методов по умолчанию. Вероятно, вам следует подать отчет об ошибке для этого. В стороне, но связано: я бы сказал, что здесь более уместен абстрактный класс. Вы действительно должны использовать только методы по умолчанию в интерфейсах, чтобы добавить функциональность к существующему интерфейсу. Использование, которое вы здесь используете, на самом деле не является предполагаемым использованием интерфейса по умолчанию. 01.11.2016
  • Инструкции по форматированию кода здесь. (Подводя итог, вставьте код, выберите его, нажмите кнопку кода { }.) 01.11.2016
  • @James_D - Спасибо за отзыв, а также за инструкции по форматированию, попробую. Согласен с предложением об абстрактном классе - теоретически, но в моем текущем проекте это решение уже оказалось слишком громоздким, методы интерфейса + по умолчанию гораздо более гибкие и элегантные/эффективные, особенно со свойствами объекта JavaFX. Вот ссылка на тему о «примесях», в которой обсуждается эта тема: dzone.com/articles/mixins -pure-java Заранее извиняюсь, если вы уже знакомы с этим. Спасибо еще раз! 01.11.2016
  • Имейте в виду, что методы по умолчанию могут привести к сбою обратной совместимости binary. (Для ясности: вы пишете и компилируете программу. Пользователь запускает ее. Пользователь обновляет библиотеку, например, JDK. Затем программа перестает работать.) Это мало документировано, но см. мой SO вопрос для обсуждения. Так что все сводится к уровню удобства, которое вам нужно... 01.11.2016
  • @James_D - Наконец, кое-что, о чем нельзя забывать. Я нахожу ваши советы и предложения здесь полезными и поучительными. Ваш вклад высоко ценится. 01.11.2016
  • Я бы сказал, что проблема связана с разбором FXMLLoader's и не имеет ничего общего с SceneBuilder, который просто использует его. FXMLLoader является частью API JavaFX 02.11.2016
  • @EugeneRyzhikov, спасибо за ответ. Вы находитесь в лучшем положении, чем я, чтобы узнать причину проблемы, я думаю, вы правы, ... но ... проблема заставляет SceneBuilder выглядеть плохо, потому что пользовательские свойства, которые пользователь ожидает увидеть, отсутствуют. 02.11.2016
  • К сожалению, это не может быть исправлено в кодовой базе SceneBuilder, но код для OpenJDK открыт, если вам это срочно - присылайте фикс :) 02.11.2016
  • Я очень хочу взглянуть на это - может ли кто-нибудь отправить мне тестовый код по электронной почте, чтобы я был уверен, что тестирую то, что нужно? Электронная почта [email protected] - спасибо. 03.11.2016
  • Кажется, это все еще проблема в 11.0.2. Есть ли тикет или какое-либо дополнительное общение на эту тему? @ДжонатанДжайлс 16.01.2021
  • @mheinzerling Мне ничего не известно об этом. Кроме того, я не уверен, активен ли еще Дж. Джайлз. 18.01.2021
  • Я попытался опубликовать запрос функции. Я обновлю эти вопросы, как только узнаю больше. 18.01.2021

Ответы:


1

Я создал запрос функции. Возможно, в будущем появится действительный ответ на этот вопрос: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8259916

18.01.2021
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]