吐槽一下~都说JavaFX比Swing好。原生UI是好看,设计跟代码分离了看起来舒服了,但为啥网上有用的资料这么少呢,为啥有些UI设计还要在代码中交代呢。想想都头疼。下面是我在用JavaFX过程中遇到的网上找不到答案的问题,希望能帮助遇到同款问题的亲们。
问题1:
在JavaFX Scene Builder的页面中明明没有间隙,但实际运行时却有间隙,怎么设计都没用。一般组件倒还好,本身需要与边框留有空间,但你给菜单栏(Menu)留这么大的空白间距是想干嘛?!
解决方法:
只能通过代码去解决。首先在FXML中给菜单栏设置 fx:id=menu ,然后在控制器(MenuController)中将它的作用域设置成 public
@FXML
public MenuBar menu; // 方便后面的调用
最后,在开始调用布局的时候设置menu的宽度:
javafx.fxml.FXMLLoader loader = new javafx.fxml.FXMLLoader(getClass().getResource("ui/Menu.fxml"));
stage.show(); // 先显示再设置。根据显示的实际宽度进行设置的
// 将菜单栏的宽度设置为与窗体宽度相等,间隙就没有了
((MenuController)loader.getController()).menu.setPrefWidth(stage.getWidth());
问题2:
网上对于设置菜单(Menu)、菜单项 (MenuItem)图标的方式都是通过代码,其实可以在FXML中通过 graphic 标签设置图标(图片尺寸最好是16x16):
<Menu mnemonicParsing="false" text="更新">
<graphic>
<ImageView>
<Image url="@img/update.png" />
</ImageView>
</graphic>
<items>
<MenuItem mnemonicParsing="false" onAction="#update" text="项目">
<graphic>
<ImageView>
<Image url="@img/project.png" />
</ImageView>
</graphic>
</MenuItem>
<SeparatorMenuItem mnemonicParsing="false" />
<MenuItem mnemonicParsing="false" onAction="#update" text="模块" >
<graphic>
<ImageView>
<Image url="@img/module.png" />
</ImageView>
</graphic>
</MenuItem>
</items>
</Menu>
效果图: