Пользовательская всплывающая панель JavaFX 2
В палитре цветов JavaFX 2 есть кнопка, которая открывает окно выбора цвета, например:
Я хотел бы сделать что-то подобное, в том смысле, что я хочу, чтобы пользовательская панель всплывала при нажатии кнопки и исчезала при нажатии на что-то другое (в моем случае несколько миниатюр изображений). Каков наилучший способ достижения этого? Должен ли я использовать ContextMenu и добавить панель в MenuItem как-то, или я должен посмотреть что-то еще?
1 ответ
Это сложно сделать с текущим API JavaFX 2.2.
Вот несколько вариантов.
Используйте MenuButton с графическим набором в его MenuItem
Этот подход, использованный в кнопке с всплывающим окном, показал ниже исполняемый пример кода.
Используйте 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.