2016-08-18 48 views
0

如果文本不符合标签的边界,我需要自动调整我的JavaFX标签上的字体大小。我在网上发现了一些很棒的代码(这里是Resize JavaFX Label if overrun),但问题是代码需要字体大小和参数。这似乎确定字体大小会很容易,但Label.getFont()返回默认设置,因为我的应用程序正在使用CSS设置字体大小。我的CSS是设置字体大小为30,但我已经想出了如何查看标签到目前为止返回默认设置为12.如何在JavaFX Label上查找应用的字体?

因此,我试图查找它,但我不明白在哪里寻找它。 Label.getStyle()返回一个空字符串。 getCSSMetaData()返回一大堆有趣的设置,我能够在那里找到字体并查看子属性,但它又一次存储字体大小12和不同样式名称的默认值。

这是我的样式表文件中的设置,我用,所以我知道我需要找到反馈卡和字体大小:

._Feedback_Card { 
-fx-font-size: 30px; 
-fx-font-weight: bold; 
-fx-text-fill: rgba(0,0,0,.9); 
-fx-background-color: white; 
-fx-border-color: white; 
-fx-border-width: 0; 
-fx-alignment: center; 
-fx-text-alignment: center; 
-fx-font-family: Arial Unicode MS; 
-fx-effect: dropshadow(gaussian, #b4b4b4, 6,0,0,2); 
} 

不要被名字所左右,有一个映射以某种方式将该组件映射到该类名称的代码中的其他位置。它是由同事写的,所以我不知道确切的机制。但鉴于这个名字我想在根节点上查找该地区:

Region node =  (Region)jsLayoutCollection.jsDisplayLayoutCollection.fGetFXParent().lookup("._Feedback_Card"); 
String sStream = node.getCssMetaData().stream() 

,然后我通过流为字体属性看。但是,这又返回字体,但大小是默认的12,而不是样式表设置它的30。

那么这个属性在哪里应用,我该如何查找它?似乎应该很直截了当地找出这些信息,但我找不到它。这是很容易设置字体后:

Label.setStyle("-fx-font-size: " + fontSize + "px"); 

任何帮助,非常感谢。

回答

3

一旦样式表已被标签的场景(或父级)加载,并且已应用CSS,getFont()将返回由CSS设置的字体。

此代码:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class GetCSSFont extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Label label = new Label("Big label"); 
     StackPane root = new StackPane(label); 
     Scene scene = new Scene(root); 
     scene.getStylesheets().add("set-font.css"); 

     System.out.println("Default font: "+label.getFont()); 

     label.applyCss(); 

     System.out.println("Font from CSS: "+label.getFont()); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

set-font.css

.label { 
    /* Note the font family needs quoting if it has spaces: */ 
    -fx-font-family: 'Arial Unicode MS' ; 
    -fx-font-size: 30px ; 
    -fx-font-weight: bold ; 
} 

.root { 
    -fx-padding: 20 ; 
} 

产生输出:

Default font: Font[name=System Regular, family=System, style=Regular, size=13.0] 
Font from CSS: Font[name=Arial Unicode MS, family=Arial Unicode MS, style=Regular, size=30.0] 

(你可以,当然,与double size = label.getFont().getSize()得到点的大小。 )

+1

啊!我错过了applyCss函数。一旦我打电话,现在字体的大小返回30。我知道这很简单......谢谢 – Mark