Этот ответ просто будет совет, нет никакого реального правильного или неправильного ответа здесь. Совет обязательно упрям и не применим ко всем ситуациям, если вы не согласны с ним, или это не относится к вашей ситуации, просто игнорируйте его.
Извините за длину, но вопрос открытый и потенциальный ответ сложный.
Я думал о подклассе Path или Canvas для использования в качестве элементов управления.
Нельзя. Favor composition over inheritance. Имейте класс управления, который реализует функциональный интерфейс элемента управления и работает независимо от того, какая технология интерфейса находится за ним. Предоставьте классу управления ссылку на класс скина, который является представлением пользовательского интерфейса элемента управления. Кожа укажет, как визуализировать элемент управления в заданном состоянии (получение состояния управления из связанного объекта управления). Кроме того, кожа будет тем, что реагирует на манипуляции с пользователем, например, нажатие мыши, и инструктирует элемент управления изменять его состояние на основе нажатия мыши - так что скин знает, с каким контролем он связан, и наоборот. В классе управления есть связанные свойства для представления состояния управления.
Простым примером является Square and SquareSkin из этой игры в стиле tic-tac-toe.
Например, представьте себе элемент управления флажком. Связующим свойством управления может быть перечисление с состояниями (проверено, непроверено, неопределено). Кожа может отображать флажок в виде квадратного квадрата с отметкой галочки для представления состояния проверки. Или, может быть, кожа будет отображать закругленный край с помощью X. Кожа может использовать любую технологию, которую вы хотите отобразить, например, холст или набор узлов. Кожа регистрирует слушатели для щелчков мышью, нажатия клавиш и т. Д. И сообщает элементу управления флажком установить его состояние проверки. Он также имеет слушателя в состоянии проверки и выберет, следует ли отображать контрольный тик на основе этого состояния.
Главное, чтобы интерфейс API к флажку был всего лишь контрольным классом флажка с состоянием проверки. То, как обрабатывается пользовательский интерфейс, абстрагируется от API-интерфейса флажка, поэтому вы можете менять реализацию пользовательского интерфейса, но вы хотите, не изменяя какой-либо другой код.
Путь подкласса сильно отличается от подкласса Canvas. Чтобы подписаться на ситуацию, я определенно хотел бы подклассифицировать узел Shape (или Region) в отличие от Canvas. Используя узлы, вы автоматически получаете действительно богатую визуализацию интерфейса и модель событий, набор свойств bindable и рамки для рисования, которые вы не получите с Canvas. Если вы не используете Nodes, вы, вероятно, в конечном итоге попытаетесь воссоздать и скомпоновать некоторые части функциональности узла некоторым нестандартным способом. Холст отлично подходит для таких вещей, как портирование 2D-игр или графических движков из других фреймворков или создание объектов, которые являются манипуляторами пикселей, такими как система частиц, но в противном случае их избегать.
Рассмотрите возможность использования панели макета для вашего скина управления, например. StackPane или что-то в этом роде. Панели компоновки представляют собой контейнеры, поэтому вы можете размещать их внутри и использовать агрегацию и состав для создания более сложных элементов управления. Панели компоновки также могут помочь в планировании ваших узлов.
Все, что подклассифицирует регион как панель, можно стилизовать с помощью CSS в произвольные формы и цвета. На самом деле это работает как встроенный флажок (и другие элементы управления) в JavaFX. Флажок - это стек из двух регионов, один - ящик, а другой - чек. Оба стиля написаны в CSS - найдите таблицу стилей .check-box in the modena.css для JavaFX. Обратите внимание, как -fx-shape
используется для получения формы галочки, указав путь svg (который вы можете создать в редакторе svg, таком как inkscape). Также обратите внимание на то, как фоновые слои используются для получения таких вещей, как кольца фокусировки. Преимущество использования CSS для стиля заключается в том, что вы можете стилистически изменять свои элементы управления, не касаясь кода Java.
поэтому использование SkinBase и BehaviourBase не вариант
Даже если вы решили не использовать эти базовые классы (которые я думаю, это нормально решение, даже если вы ориентируетесь только Java 8+) , Я думаю, что стоит изучить дизайн элементов управления в JavaFX source.Изучите кнопку или флажок, чтобы вы могли видеть, как эксперты делают такие вещи. Также обратите внимание, что такие реализации могут быть чрезмерными для вашего приложения, потому что вы не создаете повторно используемую библиотеку управления. Вам просто нужно что-то, что будет работать хорошо и просто в рамках вашего приложения (именно по этой причине я не обязательно рекомендую расширять SkinBase для всех приложений).
Как минимум read up on Controls on the open-jfx wiki.
Требуется использовать JDK 7
ИМЫ, нет особого смысла в разработке нового приложения JavaFX целевого Java 7. Было много исправлений ошибок для Java 8, плюс новых и полезными добавлены функции. В общем, Java 7 является неоптимальной целевой платформой для приложений JavaFX. Если вы упакуете приложение как self-contained application, то вы можете отправить любую платформу Java, которую вы хотите, с вашим приложением, поэтому целевая платформа не имеет значения.
Технологии внедрения IMO, такие как встроенные приложения WebStart или браузер (апплеты), которые могут использовать предварительно установленные java-среды выполнения в системе, являются устаревшими режимами развертывания, которые лучше всего избегать для большинства приложений.
Тем не менее, может возникнуть ситуация, когда у вас обязательно должна быть Java 7 из-за каких-либо ограничений вне вашего контроля, поэтому я думаю, что просто тщательно оценивайте свою ситуацию. Если у вас есть такие ограничения и вы должны опираться на стабильный, устаревший инструментарий UI, который работает с версиями, выпущенными много лет назад, вы всегда можете использовать Swing.
thx для получения детального ответа. очень хороший совет. но поскольку я не могу использовать jdk 8 (университет этого не позволяет), я решил использовать свинг. но его отличный ответ в любом случае;) – Tobi
Эта вещь Control + Skin - это просто странное имя для MVC/MVP/MV *. – cubuspl42