Javafx 2 JavaFX2:上下文菜单的模态功能

Javafx 2 JavaFX2:上下文菜单的模态功能,javafx-2,contextmenu,modal-dialog,Javafx 2,Contextmenu,Modal Dialog,有没有办法将模态功能添加到上下文菜单中 我的代码如下: package snippet; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Group; import javafx.scene.Scene; import javafx

有没有办法将模态功能添加到上下文菜单中

我的代码如下:

package snippet;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ColorPicker;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

public class ContextMenuSample extends Application
{
public static void main(String[] args)
{
    launch(args);
}

@Override
public void start(Stage stage)
{
    stage.setTitle("ContextMenuSample");

    Scene scene = new Scene(new Group(), 450, 250);

    Label toLabel = new Label("To: ");

    TextField notification = new TextField();

    final ContextMenu contextMenu = new ContextMenu();
    contextMenu.setAutoHide(false);
    contextMenu.setOnShowing(new EventHandler<WindowEvent>()
    {
        public void handle(WindowEvent e)
        {
            System.out.println("showing the context menu");
        }
    });
    contextMenu.setOnShown(new EventHandler<WindowEvent>()
    {
        public void handle(WindowEvent e)
        {
            System.out.println("context menu has been shown");
        }
    });
    MenuItem closeItem = new MenuItem("Close");
    closeItem.setOnAction(new EventHandler<ActionEvent>()
    {
        public void handle(ActionEvent e)
        {
            contextMenu.hide();
        }
    });
    MenuItem colorItem = new MenuItem("Choose", new ColorPicker());
    colorItem.setOnAction(new EventHandler<ActionEvent>()
    {
        public void handle(ActionEvent e)
        {
            System.out.println("Preferences");
        }
    });


    GridPane contextGridPane = new GridPane();

    Pane pane = new Pane();
    pane.getChildren().add(contextGridPane);


    contextMenu.getItems().addAll(colorItem, deleteItem// , subsystem1,
                                                       // radioItem
        );
    toLabel.setContextMenu(contextMenu);
    GridPane grid = new GridPane();
    grid.setVgap(4);
    grid.setHgap(10);
    grid.setPadding(new Insets(5, 5, 5, 5));
    grid.add(toLabel, 0, 0);
    grid.add(notification, 1, 0);
    grid.add(new ColorPicker(), 2, 0);
    Group root = (Group) scene.getRoot();
    root.getChildren().add(grid);
    stage.setScene(scene);
    stage.show();
}
}
包片段;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.geometry.Insets;
导入javafx.scene.Group;
导入javafx.scene.scene;
导入javafx.scene.control.ColorPicker;
导入javafx.scene.control.ContextMenu;
导入javafx.scene.control.Label;
导入javafx.scene.control.MenuItem;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.GridPane;
导入javafx.scene.layout.Pane;
导入javafx.stage.stage;
导入javafx.stage.WindowEvent;
公共类ContextMenuSample扩展应用程序
{
公共静态void main(字符串[]args)
{
发射(args);
}
@凌驾
公众假期开始(阶段)
{
stage.setTitle(“ContextMenuSample”);
场景=新场景(新组(),450,250);
标签toLabel=新标签(“至:”);
TextField通知=新建TextField();
最终上下文菜单上下文菜单=新上下文菜单();
contextMenu.setAutoHide(false);
setOnShowing(新的EventHandler())
{
公共无效句柄(WindowEvent e)
{
System.out.println(“显示上下文菜单”);
}
});
setOnShown(新的EventHandler())
{
公共无效句柄(WindowEvent e)
{
System.out.println(“上下文菜单已显示”);
}
});
MenuItem closeItem=新MenuItem(“关闭”);
setOnAction(新的EventHandler()
{
公共无效句柄(ActionEvent e)
{
contextMenu.hide();
}
});
MenuItem colorItem=new MenuItem(“选择”,new ColorPicker());
colorItem.setOnAction(新的EventHandler()
{
公共无效句柄(ActionEvent e)
{
System.out.println(“首选项”);
}
});
GridPane contextGridPane=新建GridPane();
窗格=新窗格();
pane.getChildren().add(contextGridPane);
contextMenu.getItems().addAll(colorItem,deleteItem/,子系统1,
//放射性透射电镜
);
toLabel.setContextMenu(contextMenu);
GridPane grid=新建GridPane();
网格设置间隙(4);
网格。setHgap(10);
网格设置填充(新的插图(5,5,5,5));
加(toLabel,0,0);
添加(通知,1,0);
add(新的颜色选择器(),2,0);
组根=(组)scene.getRoot();
root.getChildren().add(网格);
舞台场景;
stage.show();
}
}
当用户单击标签“To”时,会出现一个上下文菜单。我希望此上下文菜单具有模式功能,这样用户就无法在应用程序上执行任何其他操作,除非在上下文菜单上执行某些操作。此外,当上下文菜单处于活动状态时,用户应该不能单击应用程序上的任何其他位置


在这方面,

最简单的解决方案是在显示阶段之前调用另一个阶段并将其设置为。据我所知,您可能想使用
模态.APPLICATION\u MODEL

下面是一个从您的代码派生的小示例(顺便说一句,您的代码甚至不可运行,它有错误)

公共类ContextMenuSample扩展应用程序
{
公共静态void main(字符串[]args)
{
发射(args);
}
@凌驾
公共作废开始(最后阶段stageOne)
{
最终阶段WO=新阶段();
stagewo.initmodal(MODAL.APPLICATION_MODAL);
最终窗格布局按钮=新HBox(10);
窗格布局wo=新的HBox(10);
Label labelOne=新标签(“单击”);
标签标签WO=新标签(“其他点击”);
setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
stagewo.show();
}
});
setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
stagewo.close();
}
});
场景场景One=新场景(layoutOne);
场景sceneTwo=新场景(layoutTwo);
layoutOne.getChildren().add(labelOne);
layoutwo.getChildren().add(labelTwo);
第二阶段:第二阶段(第三阶段);
stagewo.setScene(scenewo);
stageOne.show();
}
}

最简单的解决方案是在显示阶段之前调用另一个阶段并将其设置为。据我所知,您可能想使用
模态.APPLICATION\u MODEL

下面是一个从您的代码派生的小示例(顺便说一句,您的代码甚至不可运行,它有错误)

公共类ContextMenuSample扩展应用程序
{
公共静态void main(字符串[]args)
{
发射(args);
}
@凌驾
公共作废开始(最后阶段stageOne)
{
最终阶段WO=新阶段();
stagewo.initmodal(MODAL.APPLICATION_MODAL);
最终窗格布局按钮=新HBox(10);
窗格布局wo=新的HBox(10);
Label labelOne=新标签(“单击”);
标签标签WO=新标签(“其他点击”);
setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
stagewo.show();
}
});
setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
stagewo.close();
}
});
场景场景One=新场景(layoutOne);
场景sceneTwo=新场景(layoutTwo);
layoutOne.getChildren().add(labelOne);
layoutwo.getChildren().add(labelTwo);
第二阶段:第二阶段(第三阶段);
stagewo.setScene(scenewo);
stageOne.show();
}
}

您能告诉我有错误的行号吗?(我有代码w
public class ContextMenuSample extends Application
{
    public static void main(String[] args)
    {
        launch(args);
    }

    @Override
    public void start(final Stage stageOne)
    {
        final Stage stageTwo = new Stage();
        stageTwo.initModality(Modality.APPLICATION_MODAL);

        final Pane layoutOne = new HBox(10);
        Pane layoutTwo = new HBox(10);

        Label labelOne = new Label("click");
        Label labelTwo = new Label("other click");

        labelOne.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                stageTwo.show();
            }
        });

        labelTwo.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                stageTwo.close();
            }
        });

        Scene sceneOne = new Scene(layoutOne);
        Scene sceneTwo = new Scene(layoutTwo);

        layoutOne.getChildren().add(labelOne);
        layoutTwo.getChildren().add(labelTwo);

        stageOne.setScene(sceneOne);
        stageTwo.setScene(sceneTwo);

        stageOne.show();
    }
}