Для создания Popupmenu в JavaFX вы можете использовать класс ContextMenu.
Вы добавляете MenuItems к нему, а также можете создавать визуальные разделители, используя SeparatorMenuItem.
В приведенном ниже примере я выбрал подкласс ContextMenu и добавил MenuItems в его конструктор.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public class AnimationPopupMenu extends ContextMenu{public AnimationPopupMenu(){(...) getItems().addAll( MenuItemBuilder.create() .text(ADD_PARTICLE) .graphic(createIcon(...)) .onAction(new EventHandler() { @Override public void handle(ActionEvent actionEvent) { // some code that gets called when the user clicks the menu item } }) .build(),(...) SeparatorMenuItemBuilder.create().build(), MenuItemBuilder.create() .text(ADD_DISTANCE_MEASURER) .onAction(new EventHandler() { @Override public void handle(ActionEvent actionEvent) { // Some code that will get called when the user clicks the menu item } }) .graphic(createIcon(...)) .build(),(...) );} |
- Строка 5: я получаю Collection потомков ContextMenu и вызываю addAll для добавления MenuItems;
- Строка 6: использует конструктор MenuItem для создания MenuItem;
- Строка 7: проходит в тексте пункта меню. Переменная ADD_PARTICLE равна «Добавить частицу»;
- Строка 8: вызывает графический объект, который получает значок пункта меню, возвращаемый createIcon:
323334353637
ImageView createIcon(URL iconURL){returnImageViewBuilder.create().image(newImage(iconURL.toString())).build();} - Строка 9: onAction получает обработчик события, который будет вызываться, когда пользователь щелкает пункт меню;
- Line15: Наконец, MenuItem создается путем выполнения build () для класса MenuItemBuilder;
- Line18: создает разделитель, который вы видите на рисунке в начале этого поста. Это пунктирная линия между «Добавить источник» и «Добавить измеритель расстояния»;
- Другие строки кода просто повторяют тот же процесс, чтобы создать остальные пункты меню.
Использование всплывающих меню JavaFX внутри JFXPanel
Если вы встраиваете сцену JavaFX в приложение Swing, вам придется выполнить некоторые дополнительные действия вручную, в противном случае во всплывающем меню не будет всплывающей анимации, и она не будет автоматически закрываться, когда пользователь щелкает снаружи. этого Для этого есть исправление, предназначенное для JavaFX 3.0 — http://javafx-jira.kenai.com/browse/RT-14899
Сначала вам нужно запросить фокус на контейнере javafx, чтобы всплывающее окно получало всплывающую анимацию, а когда вы щелкаете за пределами окна приложения, оно закрывается. В моем случае я передаю ссылку на свинговый контейнер javafx на конструктор всплывающего меню, затем перезаписываю метод show ContextMenu, чтобы запросить фокус на свинг-контейнере перед тем, как отобразить всплывающее окно:
|
1
2
3
4
5
|
public void show(Node anchor, MouseEvent event){ wrapper.requestFocusInWindow(); super.show(anchor, event.getScreenX(), event.getScreenY());} |
И, наконец, вам также нужно будет закрыть всплывающее окно, когда пользователь щелкает внутри сцены javafx, но за пределами всплывающего окна, вызывая hide ().
Я почти забыл .. спасибо Martin Sladecek (команда Oracle JavaFX) за то, что дал мне несколько советов.
Ссылка: PopupMenu в JavaFX 2 от нашего партнера JCG
