1

コンテキスト メニューに MODAL 機能を追加する方法はありますか?

私のコードは以下の通りです:

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

ユーザーがラベル「To」をクリックすると、コンテキスト メニューが表示されます。コンテキスト メニューで何らかの操作が実行されない限り、ユーザーがアプリケーションで他の操作を実行できないように、このコンテキスト メニューのモーダル機能が必要です。また、コンテキスト メニューがアクティブな場合、ユーザーはアプリケーションの他の場所をクリックできないようにする必要があります。

よろしく、

4

1 に答える 1

1

最も簡単な解決策は、ステージを表示する前に、別のステージを呼び出してinitModalityでそのモダリティを設定することです。私があなたを理解している限り、あなたはおそらく使いたいと思っています。 Modality.APPLICATION_MODEL

これはあなたのものから派生した小さな例です(ところで、あなたのコードは実行可能でもなく、エラーがありました)

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();
    }
}
于 2013-09-19T20:56:42.310 に答える