You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX按钮无法显示两位数字,调用setPrefWidth等方法无效该如何解决

问题根因

  1. 你代码中调用了questionScroll.setFitToWidth(true),该属性会强制让ScrollPane的内容(也就是你的buttonBar)的宽度和ScrollPane的视口宽度(你设置的400)绑定,当按钮总宽度超过400时,HBox会自动压缩内部按钮的宽度来适配总宽度,最终导致按钮宽度不足以显示两位数字,出现省略号。
  2. 你仅为按钮设置了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:15:03