Подтвердить что ты не робот

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

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

JavaFX 2 colour picker

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

4b9b3361

Ответ 1

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

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


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

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

wizpopup


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

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

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


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

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


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

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

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


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

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

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


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

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