2014-10-30 2 views
4

У меня есть задача запрограммировать приложение графического сетевого редактора как университетский проект. Для этого мне нужны три типа элементов/элементов управления. Форма круга, прямоугольная форма и стрелки для соединения других фигур (все это несколько походит на MS Visio). Формы/элементы управления нуждаются в дополнительных функциях, таких как перемещение, масштабирование контекстного меню и т. Д. Также мне нужно иметь полный контроль над графическим представлением этих объектов, т. Е. Я хочу «нарисовать» их самостоятельно или, по крайней мере, иметь возможность модифицировать их как я необходимость.JavaFX - Как создать простые пользовательские элементы управления?

Я использую JavaFX и не имею к этому никакого опыта. Поэтому мне было интересно, что было бы лучшим способом реализовать эти пользовательские элементы управления. Необходимо использовать JDK 7, поэтому использование SkinBase и BehaviourBase это не вариант, так как они являются частными, прежде чем JDK 8.

Я думал о подклассов Path или Canvas использовать в качестве моего контроля. Но я слишком мало знаю о последствиях для принятия обоснованного решения.

Может ли кто-нибудь дать мне совет, какие базовые классы учитывать и какие последствия могут иметь?

Thx alot.

ответ

11

Этот ответ просто будет совет, нет никакого реального правильного или неправильного ответа здесь. Совет обязательно упрям ​​и не применим ко всем ситуациям, если вы не согласны с ним, или это не относится к вашей ситуации, просто игнорируйте его.

Извините за длину, но вопрос открытый и потенциальный ответ сложный.

Я думал о подклассе 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.

+0

thx для получения детального ответа. очень хороший совет. но поскольку я не могу использовать jdk 8 (университет этого не позволяет), я решил использовать свинг. но его отличный ответ в любом случае;) – Tobi

+0

Эта вещь Control + Skin - это просто странное имя для MVC/MVP/MV *. – cubuspl42

0

От oracle класс Path представляет собой простую форму и предоставляет средства, необходимые для базовой конструкции и управления геометрическим путем, в то время как Canvas - это изображение, которое можно рисовать с использованием набора графических команд, предоставляемых GraphicsContext.

Это означает, что пользователь может использовать холст для рисования требуемых фигур по желанию пользователя.

На основных способов, которыми я могу сказать будет выглядеть следующим образом:

  1. Используйте холст, как это поможет и позволит пользователю пользовательский «рисунок». Создание кнопок меню для кругов, прямоугольников, стрелок и т. Д., Как в MS Paint. Функция «Onclick drag» на холсте может использоваться для «рисования».

  2. круг и прямоугольник доступны в библиотеках, которые можно использовать

  3. Вы можете использовать стрелки как способ используется here. Я думаю, что тот же пример, который вы хотите создать.

  4. Пользовательские контроллеры и контекстное меню могут быть созданы слишком docs.oracle.com

  5. Scaling и бегущие может быть сделаны путем привязки функции перетаскивания масштаба или перевести анимацию. Mousepressed и Mousereleased могут быть использованы для отслеживания COORDS, чтобы нарисовать фигуру в.

0

Это мой совет, вы можете использовать контрольный прототип. Или приложение или инструмент проектирования, который может предоставить вам целевое управление или значок с формой круга, прямоугольной формой и стрелками. Я не знаю, как работает мой совет. Можешь попробовать.

Смежные вопросы