JavaFX按钮无法显示两位数字,调用setPrefWidth等方法无效该如何解决
问题根因
- 你代码中调用了
questionScroll.setFitToWidth(true),该属性会强制让ScrollPane的内容(也就是你的buttonBar)的宽度和ScrollPane的视口宽度(你设置的400)绑定,当按钮总宽度超过400时,HBox会自动压缩内部按钮的宽度来适配总宽度,最终导致按钮宽度不足以显示两位数字,出现省略号。 - 你仅为按钮设置了
setMaxSize(50, 50),没有设置最小宽度限制,JavaFX布局默认优先级为「适配父容器尺寸」高于「组件最大/首选尺寸」,没有最小宽度限制的前提下,按钮会被持续压缩到能塞进父容器为止。
解决方案
按以下步骤修改代码即可解决:
- 把
questionScroll.setFitToWidth(true)改为false,让HBox的宽度由内部所有按钮的总宽度决定,超出ScrollPane宽度时自动出现横向滚动条 - 为每个按钮增加最小宽度、首选宽度的设置,避免被布局压缩
- 可以给HBox增加间距配置,优化按钮展示效果
修改后的核心代码
public QuestionNavigationBar(int quesNo) { questionScroll = new ScrollPane(); questionScroll.setVbarPolicy(ScrollBarPolicy.NEVER); // 允许横向滚动,不要强制适配HBox宽度 questionScroll.setHbarPolicy(ScrollBarPolicy.AS_NEEDED); buttonBar = new HBox(); init(quesNo); // 这里修改为false questionScroll.setFitToWidth(false); questionScroll.setContent(buttonBar); questionScroll.setPrefWidth(400); buttonBar.setStyle("-fx-border-color:cyan; -fx-border-width: 5;"); buttonBar.setPadding(new Insets(10, 0, 20, 0)); // 可选:设置按钮之间的间距 buttonBar.setSpacing(6); } //create buttons for each map entry public void init(int quesNo) { int counter = 1; while (counter <= quesNo) { Button btnTmp = new Button(Integer.toString(counter)); // 同时设置最小、首选、最大尺寸,固定按钮大小 btnTmp.setMinSize(50, 50); btnTmp.setPrefSize(50, 50); btnTmp.setMaxSize(50, 50); btnTmp.setStyle("-fx-background-color: white; "); buttonBar.getChildren().add(btnTmp); getBtnList().add(btnTmp); counter++; } }
内容的提问来源于stack exchange,提问作者RIO
相关产品推荐
相关产品推荐

