加速器不能与SceneBuilder 2.0一起使用JavaFX

时间:2018-01-23 05:44:12

标签: java javafx scenebuilder

目标:

目标很简单,我只是想为我的MenuBar文件项目实现加速器"清除所有标记"。我目前正在研究地图应用程序,我想要选择清除所有航点。我使用ESRI的ArcGIS MAPS插入MAP。

当前行为:

如果单击“编辑”菜单,然后单击“全部清除”,则可以正常工作。但是我的加速器(Ctrl + Shift + E)不起作用。

代码:

FXML文件:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.input.KeyCodeCombination?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="480.0" prefWidth="640.0" stylesheets="@DarkTheme.css" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="company.navigationapp.view.RootLayoutController">
<top>
  <MenuBar BorderPane.alignment="CENTER">
    <menus>
      <Menu mnemonicParsing="false" text="File">
        <items>
          <MenuItem mnemonicParsing="false" onAction="#handleExit" text="Exit" />
        </items>
      </Menu>
      <Menu mnemonicParsing="false" text="Edit">
        <items>
          <MenuItem mnemonicParsing="false" onAction="#handleClearAll" onMenuValidation="#handleClearAll" text="Clear All Markers">
                 <accelerator>
                    <KeyCodeCombination alt="UP" code="E" control="DOWN" meta="UP" shift="DOWN" shortcut="UP" />
                 </accelerator></MenuItem>
        </items>
      </Menu>
      <Menu mnemonicParsing="false" text="Help">
        <items>
          <MenuItem mnemonicParsing="false" onAction="#handleAbout" text="About" />
        </items>
      </Menu>
    </menus>
  </MenuBar>
</top>
</BorderPane>

RootLayoutController.java类的相关部分:

public void handleClearAll() {
    Alert alert = new Alert(AlertType.CONFIRMATION);
    alert.setTitle("Confirm Clear All");
    alert.setHeaderText("You sure you want to clear all markers?");
    alert.showAndWait();
    if(alert.getResult() == ButtonType.OK) {
         mainApp.ClearAllMarkers();
    }
    else{
        alert.close();
    }
}

问题:

如果所有内容都以这种方式设置,加速器可以正常工作,但需要使用我的BorderPane RootLayout并执行以下命令:

rootLayout.setCenter(mapView);

使加速器停止工作。

根布局初始化为:

// Load root layout from fxml file.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainApp.class.getResource("view/RootLayout.fxml"));
rootLayout = (BorderPane) loader.load();

// Show the scene containing the root layout.
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);

// Give the controller access to the main app.
RootLayoutController controller = loader.getController();
controller.setMainApp(this);

primaryStage.show();

然后通过以下代码创建mapView:

final ArcGISMap map = new ArcGISMap(Basemap.createTopographic());

MgrsGrid MGRSGrid = new MgrsGrid();

mapView = new MapView();
mapView.setMap(map);

mapView.setGrid(MGRSGrid);

所以简单地没有:

rootLayout.setCenter(mapView); 

我的加速器有效,但是当我添加它时它停止工作。关于为什么会出现这种情况的任何想法?

SceneBuilder屏幕截图:

请参阅下面的这张照片,了解它如何使用SceneBuilder进行设置,代码应该解释其余部分。 Image Showing SceneBuilder Setup

修改

可能是一个解决方案/原因,为什么这不起作用:

事实证明我使用的ArcGIS SDK有自己的内置加速器:

ArcGIS Accelerator Documentation

这可能与我试图使用的加速器发生冲突,因此解决方案可能是找出SDK包含的内置加速器,然后找出哪些可以用于我自己的利益,或者搞清楚一种完全禁用加速器的方法,以便我可以使用自己的加速器。

我会更新进度。

0 个答案:

没有答案