Menu JavaFX2.0像菜单项一样激活菜单
我正在制作一个Menu JavaFX2.0像菜单项一样激活菜单,menu,javafx,menuitem,javafx-2,menubar,Menu,Javafx,Menuitem,Javafx 2,Menubar,我正在制作一个菜单栏,我不想按一个菜单,比如:“文件”,然后执行一个操作。例如打开另一个fxml,或者编写输出的示例 我想要菜单中菜单项的功能,比如“文件” 包模型; 导入静态java.lang.System.out; 导入javafx.application.application; 导入javafx.beans.property.ReadOnlyDoubleProperty; 导入javafx.event.ActionEvent; 导入javafx.event.EventHandler; 导
菜单栏
,我不想按一个菜单
,比如:“文件”,然后执行一个操作。例如打开另一个fxml,或者编写输出的示例
我想要菜单中菜单项的功能,比如“文件”
包模型;
导入静态java.lang.System.out;
导入javafx.application.application;
导入javafx.beans.property.ReadOnlyDoubleProperty;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Pos;
导入javafx.geometry.Side;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.input.KeyCode;
导入javafx.scene.input.KeyCodeCombination;
导入javafx.scene.input.KeyCombination;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.StackPane;
导入javafx.scene.layout.VBox;
导入javafx.scene.paint.Color;
导入javafx.stage.stage;
/**
*在JavaFX中创建菜单的示例。
*
*@作者达斯汀
*/
公共类JavaFxMenus扩展了应用程序
{
/**
*为本演示构建包含菜单的菜单栏。
*
*@param menuWidthProperty Width要绑定到菜单栏宽度。
*@包含菜单的返回菜单栏。
*/
专用菜单栏buildMenuBarWithMenus(最终只读双属性menuWidthProperty)
{
最终菜单栏菜单栏=新菜单栏();
//准备最左侧的“文件”下拉菜单
最终菜单文件菜单=新菜单(“文件”);
menuBar.getMenus().add(fileMenu);
//menuBar.getOnMouseClicked().handle(此);
//准备“示例”下拉菜单
最终菜单示例菜单=新菜单(“JavaFX2.0示例”);
examplesMenu.getItems().add(新菜单项(“文本示例”);
添加(新菜单项(“对象示例”);
examplesMenu.getItems().add(新菜单项(“动画示例”);
menuBar.getMenus().add(示例菜单);
//准备“帮助”下拉菜单
最终菜单帮助菜单=新菜单(“帮助”);
helpMenu.setOnAction(空);
最终菜单项搜索菜单项=新菜单项(“搜索”);
searchMenuItem.setDisable(true);
helpMenu.getItems().add(searchMenuItem);
最终菜单项在线手册菜单项=新菜单项(“在线手册”);
onlineManualMenuItem.setVisible(假);
helpMenu.getItems().add(onlineManualMenuItem);
helpMenu.getItems().add(新分隔符numItem());
关于菜单项的最终菜单项=
MenuItemBuilder.create()
.text(“关于”)
.行动(
新的EventHandler()
{
@重写公共无效句柄(ActionEvent e)
{
println(“你点击了About!”);
}
})
.加速器(
新的KeyCodeCombination(
键码。A,键组合。控制(下)
.build();
helpMenu.getItems().add(关于菜单项);
menuBar.getMenus().add(帮助菜单);
//将菜单栏的宽度绑定到关联阶段的宽度
menuBar.prefWidthProperty().bind(menuWidthProperty);
返回菜单栏;
}
/**
*开始JavaFX应用程序演示菜单支持。
*
*@param-stage初级阶段。
*/
@凌驾
公共作废开始(最后阶段)
{
setTitle(“使用JavaFX2.0创建菜单”);
最终组根组=新组();
最终场景=新场景(根组,800,400,Color.WHEAT);
final MenuBar MenuBar=buildMenuBarWithMenus(stage.widthProperty());
rootGroup.getChildren().add(菜单栏);
舞台场景;
stage.show();
}
/**
*用于运行示例的主要可执行函数。
*
*@param arguments命令行参数:应为无。
*/
公共静态void main(最终字符串[]参数)
{
应用程序启动(参数);
}
}
AFAIK,一个菜单
,如果没有添加任何子菜单或菜单项
s,则不会在单击、显示或隐藏时触发事件。但是,解决方法是将其图形设置为该图形节点将处理鼠标单击的位置,例如
Label menuLabel = new Label("File");
menuLabel.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
Stage myDialog = new Stage();
myDialog.initModality(Modality.WINDOW_MODAL);
Scene myDialogScene = new Scene(VBoxBuilder.create()
.children(new Text("Hello! it's My Dialog."))
.alignment(Pos.CENTER)
.padding(new Insets(10))
.build());
myDialog.setScene(myDialogScene);
myDialog.show();
}
});
Menu fileMenuButton = new Menu();
fileMenuButton.setGraphic(menuLabel);
menuBar.getMenus().add(fileMenuButton);
Label menuLabel=新标签(“文件”);
menuLabel.setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
阶段myDialog=新阶段();
myDialog.initmodula(modula.WINDOW_modula);
场景myDialogScene=新场景(VBoxBuilder.create()
.children(新文本(“你好!这是我的对话”)
.校准(位置中心)
.衬垫(新插图(10))
.build());
myDialog.setScene(myDialogScene);
myDialog.show();
}
});
菜单文件菜单按钮=新建菜单();
setGraphic(menuLabel);
menuBar.getMenus().add(fileMenuButton);
这种方法的一个缺点是标签没有覆盖菜单的所有空间,因此单击菜单的边缘不会触发鼠标事件。通过取消注释上面的menuLabel.setStyle
行,可以看到这一点。但我认为,这可以通过使用CSS
样式来解决。
代码部分取自。您还可以使用fxmloader
将FXML
文件加载到myDialog
阶段。网上有很多关于它的例子。我认为你不能允许在主菜单标签上进行任何操作
但是,您可以创建一个stackpane,并用文本和菜单栏填充它。最近我遇到了同样的问题,这就是我所做的
@FXML private Menu myMenu;
@Override
public void initialize(URL url, ResourceBundle rb) {
myMenu.setGraphic(
ButtonBuilder.create()
.text("btnText")
.onAction(new EventHandler<ActionEvent>(){
@Override public void handle(ActionEvent t) {
//TODO
} })
.build()
);
}
@FXML私有菜单myMenu;
@凌驾
公共void初始化(URL、ResourceBundle rb){
myMenu.setGraphic(
ButtonBuilder.create()
.text(“btnText”)
在…上
@FXML private Menu myMenu;
@Override
public void initialize(URL url, ResourceBundle rb) {
myMenu.setGraphic(
ButtonBuilder.create()
.text("btnText")
.onAction(new EventHandler<ActionEvent>(){
@Override public void handle(ActionEvent t) {
//TODO
} })
.build()
);
}
final Menu fileMenu = new Menu("File");
fileMenu.getItems().add(new MenuItem("Dummy_menuItem"));
menuBar.getMenus().add(fileMenu);
if (numberOfMenuItems == 1) {
menu.showingProperty().addListener(
(observableValue, oldValue, newValue) -> {
if (newValue) {
// the first menuItem is triggered
menu.getItems().get(0).fire();
}
}
);
}
public static void onAction(Menu menu)
{
final MenuItem menuItem = new MenuItem();
menu.getItems().add(menuItem);
menu.addEventHandler(Menu.ON_SHOWN, event -> menu.hide());
menu.addEventHandler(Menu.ON_SHOWING, event -> menu.fire());
}
YourHelperClass.onAction(myMenu);