目标:
目标很简单,我只是想为我的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包含的内置加速器,然后找出哪些可以用于我自己的利益,或者搞清楚一种完全禁用加速器的方法,以便我可以使用自己的加速器。
我会更新进度。