Test for Label overrun

前端 未结 4 2408
慢半拍i
慢半拍i 2021-02-20 09:58

I have a multiline label whose text has a chance of overrunning. If it does this, I want to decrease the font size until it isn\'t overrunning, or until it hits some minimum siz

4条回答
  •  醉梦人生
    2021-02-20 10:26

    It's already been mentioned by Johann that you can use (Text)labeled.lookup(".text") to get the actual displayed text for a Label, then compare it to the intended String... However, in my case, this did not work. Perhaps it was because I was updating the Label with a high frequency, but the actual String was always a few chars less than the intended...

    So, I opted to use the setEllipsisString(String value) method to set the ellipsis string (what's appended to the end of a Label when there's overrun, the default being "...") to an (unused) ASCII control character like 0x03 (appropriately named "end of text"), then after each time I set the Label text I check if the last char of the actual String is the control char.

    Example using Platform.runLater(Runnable):

    import javafx.scene.control.Label;
    import javafx.application.Platform;
    import javafx.scene.text.Text;
    ...
    Label label = new Label();
    ...
    label.setEllipsisString("\003");
    ...
    final String newText = "fef foo";
    Platform.runLater(() -> {
        label.setText(newText);
        String actual = ((Text)label.lookup(".text")).getText();
        // \003 is octal for the aforementioned "end of text" control char
        if (actual.length() > 0 && actual.charAt(actual.length()-1) == '\003') {
            // Handle text now that you know it's clipped
        }
    });
    

    Note that you can set the control char to anything really, and it doesn't need to be just one char; however if you opt for a control character, check that it isn't commonly used.

提交回复
热议问题