Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Menu JavaFX2.0像菜单项一样激活菜单_Menu_Javafx_Menuitem_Javafx 2_Menubar - Fatal编程技术网

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);