0

JAVAFX では setMnemonicParsing(true) を使用してショートカットを使用しています

グーグルからのコードは以下のとおりです

VBox mainLayout = new VBox();  

MenuBar menuBar = new MenuBar();  
Menu menu1 = new Menu("_File");  
menu1.setMnemonicParsing(true);  
menu1.getItems().addAll(new MenuItem("Menu 1"), new MenuItem("Menu 2"));  

Menu menu2 = new Menu("_Other");  
menu2.setMnemonicParsing(true);  
menu2.getItems().addAll(new MenuItem("Other 1"), new MenuItem("Other 2"));  

menuBar.getMenus().setAll(menu1, menu2);  

mainLayout.getChildren().setAll(menuBar);  

Scene scene = new Scene(mainLayout, 300, 100);  

stage.setTitle("Demo of mnemonic");  
stage.setScene(scene);  
stage.sizeToScene();  
stage.show();   

手順は次のとおりです(ウィンドウプラットフォーム)

  1. Altキーを押す
  2. ニーモニック文字が見える
  3. Fキーを押す
  4. ドロップダウン メニューとフォーカスの取得
  5. 矢印(->)キーを押します
  6. 以下のようなエラー

java.lang.NullPointerException at com.sun.javafx.scene.control.skin.MenuBarSkin.isMenuEmpty(MenuBarSkin.java:728) at com.sun.javafx.scene.control.skin.MenuBarSkin.showNextMenu(MenuBarSkin.java:781) )

しかし、マウスでメニューバーをクリックしても起こりません。

解決策はありますか?

4

3 に答える 3

1

ここで Jamal に同意しなければなりません。オラクルが修正するまでは、私たち下級プログラマーに修正の負担がかかります。私は彼の修正を拡張しており、おそらく 1 つまたは 2 つの変更を加えるだけで、任意のメニューで機能するはずです。

    stage.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {

        @Override
        public void handle(KeyEvent event) {
            final int size = menuBar.getMenus().size();

            boolean showing = false;
            int index = 0;
            for(index = 0; index < menuBar.getMenus().size(); ++index) {
                if(menuBar.getMenus().get(index).isShowing()) {
                    showing = true;
                    break;
                }
            }
            index = (index < 0 ? menuBar.getMenus().size() + index : index) % size;

            if(showing) {
                Menu menu1 = null, menu2 = null;
                menu1 = menuBar.getMenus().get(index);

                if(event.getCode() == KeyCode.RIGHT) {

                    event.consume(); // remove event for next step
                    menu2 = menuBar.getMenus().get((index + 1) % size);

                    menu1.hide();
                    menu2.show();
                }
                else if(event.getCode() == KeyCode.LEFT) {

                    event.consume(); // remove event for next step

                    menu1 = menuBar.getMenus().get(index);
                    menu2 = menuBar.getMenus().get((index - 1) < 0 ? size + (index - 1) : (index - 1));

                    menu1.hide();
                    menu2.show();
                }
            }
        }
    });

個人的には、バグ修正はできる限り厳重に行うべきだと考えており、これには任意のメニュー バー サイズが必要です。したがって、私のように、メニューを動的に変更する (そしてすぐに) 完全に機能する JavaFX プログラムでこのバグに遭遇した場合は、役に立つかもしれません。

于 2014-01-24T18:51:14.700 に答える
0

以下の自己回避策。

Windows 7 の Java FX 2.2 のバグであることがわかりました。

手順::

  1. キーイベントをステージに追加
  2. consume()を取得するときのイベントRIGHTLEFTメニュー中心のイベント。
  3. 自分で実装する

stage.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {

    @Override
    public void handle(KeyEvent event) {
        if(menu1 .isShowing() || menu2 .isShowing() || menu2 .isShowing()) {

            if(event.getCode() == KeyCode.RIGHT) {

                log.debug("right");
                event.consume(); // remove event for next step

                if(menu1.isShowing()) {
                    menu1.hide();
                    menu2.show();
                }
                else if(menu2.isShowing()) {
                    menu2.hide();
                    menu3.show();
                }
                else if(menu3.isShowing()) {
                    menu3.hide();
                    menu1.show();
                }
            }
            else if(event.getCode() == KeyCode.LEFT) {

                log.debug("left");
                event.consume();

                if(menu1.isShowing()) {
                    menu1.hide();
                    menu3.show();
                }
                else if(menu2.isShowing()) {
                    menu2.hide();
                    menu1.show();
                }
                else if(menu3.isShowing()) {
                    menu3.hide();
                    menu2.show();
                }
            }
        }
    }
});
于 2013-10-29T04:54:01.567 に答える