在本文的后面,我將列出此示例的整個代碼清單,但首先顯示代碼片段,以使您更輕松地專注于每一部分。 使用JavaFX 2.0菜單的一個很好的起點是實例化MenuBar的實例。 如下所示,這很簡單。
實例化javafx.scene.control.MenuBar
final MenuBar menuBar = new MenuBar();
MenuBar
可以包含Menu實例作為其子級,并且每個Menu
實例都可以具有MenuItem的實例作為其子級。 下一個代碼清單演示了Menu
實例化,將MenuItem
實例(或SeparatorMenuItem的實例)添加到該Menu
實例,然后將Menu
實例添加到MenuBar
的實例。
將新實例化的Menu和MenuItem實例添加到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);
上面的示例對于實際使用而言過于簡化。 沒有任何與單擊任何菜單項相關聯的事件處理程序或操作,并且沒有通過擊鍵而不是通過鼠標單擊來選擇菜單項的方法。 下一個代碼清單演示了MenuItem
實例的實例化,這些實例不僅包含文本字符串,還包含更多內容。 在此代碼清單中,有一個使用MenuItemBuilder構建更復雜的MenuItem
的示例,該MenuItem包括與按鍵組合的關聯以及與動作處理程序的關聯。
具有擊鍵和事件關聯的更復雜的MenuItem實例化
// 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(boolean)或禁用菜單項(顯示為灰色)或使用setVisible(boolean)使其完全不顯示。 盡管我可以指定禁用菜單項或使用MenuItemBuilder
使菜單項不可見,但在此示例中,我有意在MenuItem
上使用了“ set”方法來與使用MenuItemBuilder
進行對比。
為了完整起見,這是我的示例的完整代碼清單。
JavaFxMenus.java(完整清單)
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 menufinal 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 menufinal 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 menufinal 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 stagemenuBar.prefWidthProperty().bind(menuWidthProperty);return menuBar;}/*** Start of JavaFX application demonstrating menu support.* * @param stage Primary stage.*/@Overridepublic 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工具和JavaFX 2.0 JAR來實現。
祝您編程愉快,別忘了分享!
參考:( 純Java) JCG合作伙伴 Dustin Marx的JavaFX 2.0菜單,來自Inspired by Actual Events博客。
翻譯自: https://www.javacodegeeks.com/2012/09/pure-java-javafx-20-menus.html