У меня есть графический интерфейс javafx, который содержит текстовое поле.Я хочу знать, как найти наилучший размер шрифта для текста, который можно установить на.
Размер текстового поля не может быть изменен в соответствии с текстом, а текст не может быть усечен / переполнен.
Во время выполнения программы текстовое поле может изменять свои размеры, а текст может менять шрифт (например, с Arial на Comic Sans) или сам текст (с отдельных слов на абзацы), и мне нужно убедиться, чточто размер текста изменяется в соответствии с размером текстового поля.
Текстовое поле может быть любым узлом, содержащим текст, такой как label, textFlow, textArea ...
Я написал 3 различные попыткипопытаться разработать такой алгоритм, но ни один из них не сработал.
Основной код:
public class Main extends Application{
String text = new String("Lorem ipsum dolor sit amet, consectetur adipiscing elit. In scelerisque elit ante, eu lacinia dui molestie quis. Donec consectetur elementum.");
TextFlow textBox;
AnchorPane anchorPane;
public static void main(String[] args) {
launch();
}
@Override
public void start(Stage primaryStage) throws Exception{
textBox = new TextFlow(new Text(text));
textBox.setTextAlignment(TextAlignment.CENTER);
anchorPane = new AnchorPane(textBox);
AnchorPane.setTopAnchor(textBox,0d);
AnchorPane.setBottomAnchor(textBox,0d);
AnchorPane.setRightAnchor(textBox,0d);
AnchorPane.setLeftAnchor(textBox,0d);
Scene scene = new Scene(anchorPane);
primaryStage.setScene(scene);
primaryStage.show();
textBox.widthProperty().addListener(new ChangeListener<Number>(){
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue){
autoSizeTextBoxText();
}
});
textBox.heightProperty().addListener(new ChangeListener<Number>(){
@Override
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue){
autoSizeTextBoxText();
}
});
}
public void setTextBoxFont(Font font){
((Text)textBox.getChildren().get(0)).setFont(font);
autoSizeTextBoxText();
}
public void setTextBoxText(String text){
((Text)textBox.getChildren().get(0)).setText(text);
autoSizeTextBoxText();
}
public void autoSizeTextBoxText(){
Font font = TextAndFontHelper.getOptimalFont(((Text)textBox.getChildren().get(0)).getText(),textBox,((Text)textBox.getChildren().get(0)).getFont());
System.out.println(font.getSize());
((Text)textBox.getChildren().get(0)).setFont(font);
anchorPane.layout();
textBox.layout();
}
}
public class TextAndFontHelper{
public static double getTextWidth(Text text){
double width = text.getBoundsInLocal().getWidth();
return width;
}
public static double getTextHeight(Text text){
double height = text.getBoundsInLocal().getHeight();
return height;
}
public static double getTextArea(Text text){
double area = getTextHeight(text)*getTextWidth(text);
return area;
}
public static Font getOptimalFont(String textString, Region textBox,Font font){
//... This is the method that I want to write
}
}
Это мои попытки:
Попытка # 1: Эта попыткаочень затруднительно, размер текста постоянно меняется от хорошего размера (хотя и не идеального, так как его можно немного увеличить) до большого размера, который не умещается на экране при каждом срабатывании алгоритма.https://imgur.com/a/jMDoTeR
Text text = new Text(textString);
if (font != null)
text.setFont(font);
double textBoxArea = textBox.getHeight()*textBox.getWidth();
double textArea = getTextArea(text);
double ratio = textBoxArea/textArea;
return new Font(text.getFont().getFamily(),text.getFont().getSize()*ratio);
Попытка № 2: Эта попытка очень затруднительна, размер текста постоянно меняется от слишком маленького до слишком большого экрана каждый раз, когда срабатывает алгоритм.https://imgur.com/a/i5IvNTw
Text text = new Text(textString);
if (font != null)
text.setFont(font);
double heightRatio = textBox.getHeight()/getTextHeight(text);
double widthRatio = textBox.getWidth()/getTextWidth(text);
double ratio = heightRatio*widthRatio;
return new Font(text.getFont().getFamily(),text.getFont().getSize()*ratio);
Попытка № 3: Эта попытка была предпринята на основе этого вопроса: Изменить размер шрифта SKLabelNode, чтобы соответствовать? .Хотя этот алгоритм не слишком сложен, размер текста изменяется так, чтобы он занимал всего 1 строку (иногда переполняется во 2-ю) и, следовательно, слишком мал.https://imgur.com/a/LWIH4Zr
Text text = new Text(textString);
if (font != null)
text.setFont(font);
double heightRatio = textBox.getHeight()/getTextHeight(text);
double widthRatio = textBox.getWidth()/getTextWidth(text);
double ratio = Math.min(heightRatio,widthRatio);
return new Font(text.getFont().getFamily(),text.getFont().getSize()*ratio);