Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
菜单相同大小的父SplitMenuButton javaFX_Java_Javafx_Menu - Fatal编程技术网

菜单相同大小的父SplitMenuButton javaFX

菜单相同大小的父SplitMenuButton javaFX,java,javafx,menu,Java,Javafx,Menu,我在JavaFX whit FXML中工作,我想制作一个带有调整大小属性和限制增长的顶部菜单。为此,我在GridePane中使用SplitMenuButtons。它工作得很好,但我在添加菜单时遇到了问题。它看起来像这样 菜单上的字数很少 我的想法是在SplitMenuButton的widthProperty中放置一个侦听器,然后设置menu.prefWidth,但该菜单没有setPrefWidth或prefWidth方法 所以我解决了这个问题,编写了这个代码,添加了一个带填充的标签,但是它看起

我在JavaFX whit FXML中工作,我想制作一个带有调整大小属性和限制增长的顶部菜单。为此,我在GridePane中使用SplitMenuButtons。它工作得很好,但我在添加菜单时遇到了问题。它看起来像这样

菜单上的字数很少

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

所以我解决了这个问题,编写了这个代码,添加了一个带填充的标签,但是它看起来很难看,我不知道如何获得正确的大小,因为菜单中的文本,我也不知道如何计算菜单中文本的大小,这就是我得到的

它看起来很难看,行为随机。我的代码如下

 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);
    });
我正在寻找一种方法,使菜单的大小和菜单项的大小相同。我正在寻找的结果是这样的

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

那么我该怎么做呢?改变4个顶级菜单的节点类型?CSS(但我认为CSS的改变是永久性的,如果父菜单改变了大小,就不会重新计算,但我不确定)?,其他选项?

您可以尝试使用
菜单项
在第一级
菜单和
菜单项
上放置一个带有所需文本的
标签
。然后可以将
标签的
绑定到
拆分菜单按钮

示例

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
s会稍微宽一点(因为内部填充),但是您可以稍微定制CSS样式类
菜单项
使其大小完全相同:您可以检查和设置

还有一个肮脏的解决方案:对于下面的图片,我修改了
label.prefWidthProperty().bind(menuButton.widthProperty())
to
label.prefWidthProperty().bind(menuButton.widthProperty().subtract(32))