Я перечислю полный список кода для этого примера позже в этом посте, но сначала я покажу фрагменты кода, чтобы упростить фокусировку на каждом фрагменте. Хорошей отправной точкой для использования меню JavaFX 2.0 является создание экземпляра MenuBar . Это просто, как показано ниже.
Создание javafx.scene.control.MenuBar
1
|
final MenuBar menuBar = new MenuBar(); |
MenuBar
может содержать экземпляры Menu в качестве своих потомков, и каждый экземпляр Menu
может иметь экземпляры MenuItem в качестве своих дочерних элементов. Следующий листинг кода демонстрирует создание экземпляра Menu
, добавление экземпляров MenuItem
(или экземпляра SeparatorMenuItem ) к этому экземпляру Menu
, а затем добавление экземпляра Menu
к экземпляру MenuBar
.
Добавление новых экземпляров Menu и MenuItem в MenuBar
1
2
3
4
5
6
7
8
9
|
// Prepare left-most 'File' drop-down menu final Menu fileMenu = new Menu( 'File' ); fileMenu.getItems().add( new MenuItem( 'New' )); fileMenu.getItems().add( new MenuItem( 'Open' )); fileMenu.getItems().add( new MenuItem( 'Save' )); fileMenu.getItems().add( new MenuItem( 'Save As' )); fileMenu.getItems().add( new SeparatorMenuItem()); fileMenu.getItems().add( new MenuItem( 'Exit' )); menuBar.getMenus().add(fileMenu); |
Приведенный выше пример слишком упрощен для реалистичного использования. Нет никаких обработчиков событий или действий, связанных с щелчком по любому из пунктов меню, и нет никаких способов выбрать пункты меню нажатием клавиши, а не щелчком мыши. Следующий листинг кода демонстрирует создание экземпляров MenuItem
которые включают в себя больше, чем просто текстовую строку. В этом листинге кода есть пример использования MenuItemBuilder для создания гораздо более сложного MenuItem
который включает в себя ассоциацию с комбинацией клавиш и включает ассоциацию с обработчиком действия.
Более сложная реализация MenuItem с помощью сочетаний клавиш и событий
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
|
// Prepare 'Help' drop-down menu final Menu helpMenu = new Menu( 'Help' ); final MenuItem searchMenuItem = new MenuItem( 'Search' ); searchMenuItem.setDisable( true ); helpMenu.getItems().add(searchMenuItem); final MenuItem onlineManualMenuItem = new MenuItem( 'Online Manual' ); onlineManualMenuItem.setVisible( false ); helpMenu.getItems().add(onlineManualMenuItem); helpMenu.getItems().add( new SeparatorMenuItem()); final MenuItem aboutMenuItem = MenuItemBuilder.create() .text( 'About' ) .onAction( new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { out.println( 'You clicked on About!' ); } }) .accelerator( new KeyCodeCombination( KeyCode.A, KeyCombination.CONTROL_DOWN)) .build(); helpMenu.getItems().add(aboutMenuItem); menuBar.getMenus().add(helpMenu); |
Помимо демонстрации MenuItemBuilder
, связывания комбинации клавиш (в данном случае CTRL-A) с элементом меню и связывания действия с элементом меню, этот пример кода также демонстрирует отключение ( выделение серым цветом) пункта меню с помощью setDisable (логическое значение) или заставить его вообще не появляться с помощью setVisible (boolean) . Хотя я мог бы указать отключение пункта меню или сделать его невидимым с помощью MenuItemBuilder
, я намеренно использовал методы set для MenuItem
в этом примере, чтобы противопоставить этот подход использованию MenuItemBuilder
.
Для полноты, вот полный список кода моего примера.
JavaFxMenus.java (полный список)
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
|
package dustin.examples; import static java.lang.System.out; import javafx.application.Application; import javafx.beans.property.ReadOnlyDoubleProperty; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; import javafx.scene.input.KeyCombination; import javafx.scene.paint.Color; import javafx.stage.Stage; /** * Example of creating menus in JavaFX. * * @author Dustin */ public class JavaFxMenus extends Application { /** * Build menu bar with included menus for this demonstration. * * @param menuWidthProperty Width to be bound to menu bar width. * @return Menu Bar with menus included. */ private MenuBar buildMenuBarWithMenus( final ReadOnlyDoubleProperty menuWidthProperty) { final MenuBar menuBar = new MenuBar(); // Prepare left-most 'File' drop-down menu final Menu fileMenu = new Menu( 'File' ); fileMenu.getItems().add( new MenuItem( 'New' )); fileMenu.getItems().add( new MenuItem( 'Open' )); fileMenu.getItems().add( new MenuItem( 'Save' )); fileMenu.getItems().add( new MenuItem( 'Save As' )); fileMenu.getItems().add( new SeparatorMenuItem()); fileMenu.getItems().add( new MenuItem( 'Exit' )); menuBar.getMenus().add(fileMenu); // Prepare 'Examples' drop-down menu final Menu examplesMenu = new Menu( 'JavaFX 2.0 Examples' ); examplesMenu.getItems().add( new MenuItem( 'Text Example' )); examplesMenu.getItems().add( new MenuItem( 'Objects Example' )); examplesMenu.getItems().add( new MenuItem( 'Animation Example' )); menuBar.getMenus().add(examplesMenu); // Prepare 'Help' drop-down menu final Menu helpMenu = new Menu( 'Help' ); final MenuItem searchMenuItem = new MenuItem( 'Search' ); searchMenuItem.setDisable( true ); helpMenu.getItems().add(searchMenuItem); final MenuItem onlineManualMenuItem = new MenuItem( 'Online Manual' ); onlineManualMenuItem.setVisible( false ); helpMenu.getItems().add(onlineManualMenuItem); helpMenu.getItems().add( new SeparatorMenuItem()); final MenuItem aboutMenuItem = MenuItemBuilder.create() .text( 'About' ) .onAction( new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { out.println( 'You clicked on About!' ); } }) .accelerator( new KeyCodeCombination( KeyCode.A, KeyCombination.CONTROL_DOWN)) .build(); helpMenu.getItems().add(aboutMenuItem); menuBar.getMenus().add(helpMenu); // bind width of menu bar to width of associated stage menuBar.prefWidthProperty().bind(menuWidthProperty); return menuBar; } /** * Start of JavaFX application demonstrating menu support. * * @param stage Primary stage. */ @Override public void start( final Stage stage) { stage.setTitle( 'Creating Menus with JavaFX 2.0' ); final Group rootGroup = new Group(); final Scene scene = new Scene(rootGroup, 800 , 400 , Color.WHEAT); final MenuBar menuBar = buildMenuBarWithMenus(stage.widthProperty()); rootGroup.getChildren().add(menuBar); stage.setScene(scene); stage.show(); } /** * Main executable function for running examples. * * @param arguments Command-line arguments: none expected. */ public static void main( final String[] arguments) { Application.launch(arguments); } } |
Следующая серия снимков экрана пытается продемонстрировать, как это приложение выглядит при запуске с использованием java
лаунчера. Изображения показывают первоначальный вид приложения, раскрывающееся меню, отображаемое при нажатии меню «Файл», раскрывающееся меню, отображаемое при нажатии меню «Справка», и, наконец, изображение, показывающее написанное сообщение. к стандартному выводу при нажатии пункта меню «О программе» в меню «Справка».
Код в примере, приведенном в этом посте, имеет множество синтаксических функций, которые должны казаться знакомыми разработчикам Swing. На самом деле, многие из классов JavaFX, использованных выше, имеют те же имена, что и классы AWT, и поэтому необходимо соблюдать осторожность при импорте правильного класса при использовании предложений автоматического импорта в среде IDE.
В приведенном выше примере также приведен пример привязки JavaFX. В частности, ширина строки меню связана с шириной ширины сцены. Это полезно, потому что выглядит лучше, чтобы строка меню охватывала всю верхнюю часть визуала, а не была достаточно широкой, чтобы удерживать метки меню.
Создание меню довольно просто в JavaFX 2.0 и может быть реализовано с использованием базовых инструментов Java и JAR JavaFX 2.0.
Приятного кодирования и не забудьте поделиться!
Ссылка: (Чистая Java) JavaFX 2.0 Меню от нашего партнера JCG Дастина Маркса в блоге Inspired by Actual Events .