JavaFX:如何通过CSS和FXML动态调整TextArea字体大小(25%-225%)
问题
需要实现TextArea字体大小按25%-225%的比例动态调整,最终从配置文件加载缩放比例。当前相关代码如下:
FXML代码:
<TextArea fx:id="txtDescription" layoutY="25.0" prefHeight="471.0" prefWidth="1036.0" />
CSS代码:
.text-area { -fx-font-size: 25; }
在MainController中已通过@FXML private TextArea txtDescription;获取控件引用,但执行以下代码无法获取样式信息:
System.out.println("Get Style: " + txtDescription.getStyle()); System.out.println("Get StyleNode: " + txtDescription.getStyleableNode());
解决方案
步骤1:确定基准字体大小
以CSS中设置的默认字体大小25px作为基准值,可在控制器初始化时将其保存为变量(比如private double baseFontSize = 25;),方便后续计算。
步骤2:从配置文件加载缩放比例
使用Java的Properties类读取配置文件中的缩放比例,将百分比转为0.25-2.25之间的浮点数(对应25%-225%),示例代码:
Properties config = new Properties(); try (InputStream input = getClass().getResourceAsStream("/config.properties")) { config.load(input); // 读取配置值,默认100%(即1.0) String scaleStr = config.getProperty("fontScale", "100%"); double scale = Double.parseDouble(scaleStr.replace("%", "")) / 100; // 限制比例在合法范围内 scale = Math.max(0.25, Math.min(2.25, scale)); } catch (IOException e) { e.printStackTrace(); }
步骤3:动态设置TextArea字体大小
有两种可靠实现方式:
方式一:设置Inline样式
通过setStyle直接覆盖字体大小,优先级高于外部CSS样式:
double calculatedSize = baseFontSize * scale; txtDescription.setStyle("-fx-font-size: " + calculatedSize + "px;");
方式二:使用Font对象设置(推荐)
该方式不会覆盖控件其他Inline样式,灵活性更高:
double calculatedSize = baseFontSize * scale; Font currentFont = txtDescription.getFont(); txtDescription.setFont(Font.font(currentFont.getFamily(), calculatedSize));
补充:样式获取无结果的原因
getStyle()仅返回控件直接设置的Inline样式(如FXML中style属性定义的内容),而CSS样式表中的样式属于外部样式,不会被该方法返回。若要获取控件实际生效的字体大小,可使用txtDescription.getFont().getSize()。
内容的提问来源于stack exchange,提问作者Mizzy
相关产品推荐
相关产品推荐

