Как мы определяем контекстное меню в FXML? - PullRequest
0 голосов
/ 20 ноября 2018

Хотя я мог бы определить ContextMenu без FXML, я не нашел хорошего способа определить контекстное меню в FXML:

В исходном файле:

ContextMenu contextMenu = new ContextMenu();
contextMenu.getItems().addAll(someMenuItems);
// This runs perfectly

В FXML:

<ContextMenu fx:id="contextMenu">
</ContextMenu>
// This is incorrect in fxml. The Exception of "Unable to coerce javafx.scene.control.ContextMenu to class javafx.scene.Node" is thrown.

<MenuBar fx:id="menuBar">
    //... Some Menu and items could be defined here
</MenuBar>
// This is correct in fxml

Я понимаю, что MenuBar работает, потому что он расширяет javafx.scene.control.Control, который является подклассом javafx.scene.Node, но ContextMenu этого не делает.

Так есть ли способ определить свойства ContextMenu аналогичным образом в FXML?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Попробуйте это

<BorderPane fx:id="borderPane" fx:controller="sample.Controller" xmlns:fx="http://javafx.com/fxml">
    <fx:define>
        <ContextMenu fx:id="contextMenu">
            <items>
                <MenuItem text="Menu Item"/>
            </items>
        </ContextMenu>
    </fx:define>
</BorderPane>
public class Controller {

    @FXML
    private ContextMenu contextMenu;

    @FXML
    private BorderPane borderPane;

    @FXML
    private void initialize() {
        borderPane.setOnContextMenuRequested(event -> {
            contextMenu.show(borderPane, event.getScreenX(), event.getScreenY());
        });
    }
}
0 голосов
/ 20 ноября 2018

Попробуйте определить его в соответствующем контексте узла (без каламбура :) через свойство contextMenu:

<TextField fx:id="tf">
    <contextMenu>
        <ContextMenu fx:id="cmTF">
            <items>
                <MenuItem text="Add"/>
                <MenuItem text="Remove"/>
                <MenuItem text="Enhance"/>
            </items>
        </ContextMenu>
    </contextMenu>
</TextField>
...