I have a Label in a GridPane in a TitledPane. I want it to downsize stepwise by 0.05em if it is overrun so the three dots ("Long Labe...") dont show up -> "Long Label" in small.
An isOverrun()-method for the Label would be great but JavaFX doesnt supply that and life isn't a wishconcert.
So my workarround so far:
Bounds tpBounds = tPane.getBoundsInLocal();
Bounds lblBounds = label.getBoundsInLocal();
Double fontSize = 1.0;
while (tpBounds.getWidth() < lblBounds.getWidth() && fontSize > 0.5) {
fontSize = fontSize-0.05;
label.setStyle("-fx-font-size: "+fontSize+"em;");
System.out.println(fontSize+" "+tpBounds.getWidth()+" "+lblBounds.getWidth());
}
The problem: during the while loop, bounds.getWidth() is always showing the original width. The "new" width with the new fontsize is not refreshing quick enough to get catched by the while-condition, so the fontsize is getting lower and lower.
Any Solutions?
edit
I ask more commonly: Is it really THAT HARD to make a Label downsize itself, till it fits without truncating?!
This is a hack inspired from internal api.
The JavaFX uses
com.sun.javafx.scene.control.skin.Utils
class to various text based calculations. This also includes calculation of overrun texts to how much clip the original text and at where to show ellipsis text etc.For the not wrapped and not multiline label texts there is only 3 methods used in this class:
Since this class is an internal api, I just copied those 3 methods (along with necessary class variables) to my own Utils class and used as:
Based on your requirements you can simplify the logic and improve the calculation time of
computeClippedText()
method further.