Пользовательская всплывающая панель JavaFX 2

В наборе цветов JavaFX 2 есть кнопка, которая отображает панель выбора цвета:

Выбор цвета JavaFX 2

Я хотел бы сделать что-то подобное, потому что мне хотелось бы, чтобы пользовательская панель всплывала, когда кнопка нажата и исчезает при нажатии на что-то еще (в моем случае несколько эскизов изображений). Какой был бы лучший способ добиться этого? Должен ли я использовать ContextMenu и добавить панель в MenuItem, или есть что-то еще, на что я должен смотреть?

С нынешним API JavaFX 2.2 сложно преуспеть.

Вот несколько вариантов.


Используйте MenuButton с графическим набором в его MenuItem

Это подход, примененный в Button с всплывающим окном, который показан ниже в примере кода исполняемого кода .

wizpopup


Использовать PopupControl

Посмотрите, как ColorPicker делает это в своем коде .

ColorPicker расширяет PopupControl . Вы можете это сделать, но не все API, необходимые для создания собственного PopupControl, в настоящее время являются общедоступными. Итак, для JavaFX 2.2 вам придется полагаться на внутренние classы com.sun, которые устарели и будут заменены общедоступными classами javafx.scene.control в JDK8.


Использовать ContextMenu

Итак, я думаю, что ваша идея «использовать ContextMenu и добавить панель в MenuItem», вероятно, сейчас является лучшим подходом. Вы должны сделать это, используя CustomMenuItem или установив графику в обычном MenuItem . ContextMenu имеет хорошую относительную логику позиционирования . ContextMenu также может запускаться с помощью MenuButton .


Использование пользовательского диалога

Для этого отобразите прозрачную сцену в местоположении относительно узла.

Существует несколько примеров кода, чтобы начать работу, которую я временно связал здесь . Пример кода делает относительное позиционирование по сторонам главного windows, но вы можете обновить его, чтобы выполнить позиционирование относительно сторон данного узла (например, метод show ContextMenu).


Использовать стеклянную панель

Для этого создайте StackPane в качестве корня вашего основного windows. Поместите основную область содержимого в качестве первого узла в StackPane, а затем создайте группу в качестве второго узла в стеке, чтобы она переместилась поверх основного содержимого. Обычно верхняя группа ничего не содержит, но когда вы хотите показать свое всплывающее окно, поместите его в верхнюю группу и переведите его в местоположение относительно соответствующего узла в своем основном контенте.

Вы можете посмотреть, как узлы привязки в этой демонстрации используются, чтобы увидеть, как это может быть адаптировано к вашему контексту.


Есть ли соответствующее обновление для JavaFX8?

В Java 8 нет большой разницы в значимости, в общем, параметры описаны в этой статье на основе функциональности Java 2.2. Java 8 добавляет функциональность Dialog и Alert , но они более ориентированы на использование диалогов с границами, названиями и кнопками, а не с той функциональностью, которая нужна в вопросе. Возможно, вы можете начать с classа Dialog и сильно настроить его, чтобы получить что-то близкое к тому, что необходимо, но вам, вероятно, лучше начать с пустой сцены или PopupControl.

Давайте будем гением компьютера.