java - 菜单大小与父级 SplitMenuButton javaFX 相同

标签 java javafx menu

我在 JavaFX 和 FXML 中工作,我想制作一个具有调整大小属性和约束增长的顶级菜单,我在 GridePane 中使用 SplitMenuButtons 它工作得很好但是当我添加菜单时我遇到了问题它看起来像这样

https://postimg.org/image/566jrsvpj/

菜单很小

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

所以我解决了这个问题并制作了这段代码,它添加了一个带有填充的标签,但它看起来很难看,而且由于菜单的文本,我不知道如何获得正确的大小,而且我也不知道如何计算大小菜单中的文字这就是我得到的

https://s31.postimg.org/96o9nxch7/image.png

它看起来很丑,而且表现随机我的代码如下

 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);
    });

我正在寻找一种使菜单大小相同且菜单项大小也相同的方法,我正在寻找的结果是这样的

https://s32.postimg.org/z6zel4tbp/image.png

对不起,我手头只有一张不好的照片

那么我如何制作我正在寻找的东西?,更改 4 个顶级菜单的节点类型?,CSS(但我认为 CSS 的更改是永久性的,如果父级更改大小则不会重新计算,但我不确定)?, 其他选择?

最佳答案

您可以尝试使用 graphicProperty MenuItem 将带有所需文本的 Label 作为图形放在第一级 MenuMenuItem 上。然后你可以绑定(bind) prefWidthProperty LabelwidthPropertySplitMenuButton

示例

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));.

enter image description here

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

相关文章:

java - 限制ip地址访问web服务

java - 无法将 setArray JDBC(整数)与 H2 数据库一起使用

java - 将 FXML 加载到 AnchorPane 时如何自动调整大小?

javaFX 在标签或微调器中存储数字格式

html - Bootstrap 在导航菜单中自动向左浮动

qt - Qml 可滑动页面

java - 在 javadoc 中使用 @value 和 data.properties 文件

java - BindingResult 和 bean 名称 'student' 的普通目标对象都不能作为请求属性 - Spring MVC

javafx 可点击图像 map

IE8 的 CSS 菜单问题 - 调试