Статьи

PopupMenu в JavaFX 2

Создание всплывающих меню

Для создания 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:
    32
    33
    34
    35
    36
    37
    ImageView createIcon(URL iconURL)
        {
            return ImageViewBuilder.create()
                                   .image(new Image(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