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

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

Палитра цветов JavaFX 2

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

1 ответ

Решение

Это сложно сделать с текущим API JavaFX 2.2.

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


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

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

wizpopup


Используйте PopupControl

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

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


Используйте ContextMenu

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


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

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

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


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

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

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


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

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

Другие вопросы по тегам