我正在JavaFX whit FXML中工作,我想为此创建一个具有调整大小属性和受限增长的顶部菜单,我在GridePane中使用SplitMenuButtons效果很好,但是当我添加看起来像这样的菜单时遇到了问题

java - 父父SplitMenuButton javaFX的菜单大小相同-LMLPHP

菜单很小

我的想法是将侦听器放入SplitMenuButton的widthProperty中,然后设置menu.prefWidth,但是菜单没有setPrefWidth或prefWidth方法

所以我解决了这个问题,使这段代码添加了带标签的标签,但是它看起来很丑,由于菜单文本,我不知道如何获得正确的大小,而且我也不知道如何计算文本的大小我得到的菜单

java - 父父SplitMenuButton javaFX的菜单大小相同-LMLPHP

它看起来非常丑陋,并且行为随机,我的代码如下

 SplitMenuButton.widthProperty().addListener((e,n,v)->{
        Label lal = new Label(">");
        Insets inces = new Insets(0,0,0,n.intValue());
        lal.setPadding(inces);
        Menu.setGraphic(lal);
    });

我正在寻找一种方法来使菜单具有相同的大小,并且菜单项也具有与我正在寻找的结果相同的大小,就像这样

java - 父父SplitMenuButton javaFX的菜单大小相同-LMLPHP

对不起,这张照片是我手头唯一的东西

所以我该怎么找我呢?,更改4个顶部菜单的节点类型?,CSS(但我认为CSS的更改是永久性的,如果父级更改大小,则不会重新计算,但我不确定),其他选择?

最佳答案

您可以尝试使用MenuItemgraphicProperty将带有所需文本的Label作为图形放在第一层MenuMenuItem上。然后,您可以将LabelprefWidthProperty绑定到SplitMenuButtonwidthProperty

示例

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());


            SplitMenuButton splitMenuButton = new SplitMenuButton();
            splitMenuButton.setPrefWidth(400);

            MenuItem menuItem = new MenuItem();
            prepareMenuItem(menuItem, "I am a MenuItem", splitMenuButton);
            Menu menu = new Menu();
            prepareMenuItem(menu, "I am a Menu", splitMenuButton);
            MenuItem subMenuItem = new MenuItem("I am not resized!");
            menu.getItems().add(subMenuItem);

            splitMenuButton.getItems().addAll(menu, menuItem);

            root.setCenter(splitMenuButton);

            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    private void prepareMenuItem(MenuItem menuItem, String text, MenuButton menuButton){
        Label label = new Label();
        label.prefWidthProperty().bind(menuButton.widthProperty());
        label.setText(text);
        label.setTextAlignment(TextAlignment.RIGHT);
        menuItem.setGraphic(label);
    }

    public static void main(String[] args) {
        launch(args);
    }
}

但是,结果并不理想,因为下拉列表中的MenuItem会稍宽(由于内部填充),但是您可以对CSS样式类menu-item进行一些调整,使其大小完全相同:您可以检查modena.cssJavafX CSS Reference Guide

还有一个肮脏的解决方案:对于以下图片,我已将label.prefWidthProperty().bind(menuButton.widthProperty());修改为label.prefWidthProperty().bind(menuButton.widthProperty().subtract(32));

java - 父父SplitMenuButton javaFX的菜单大小相同-LMLPHP

关于java - 父父SplitMenuButton javaFX的菜单大小相同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37983054/

10-16 23:34