Я создаю небольшой текстовый редактор с JavaFX.
Для этой цели я использую TextArea и ComboBox'ы для его динамического оформления: например, изменение шрифта, его размера, выделение жирным шрифтом, курсивом и т. д. Это вроде работает, однако есть неприятная визуальная ошибка, с которой я не могу смириться.
Я попытался сузить проблему, и вот более простой код с таким же поведением и парой картинок, чтобы понять, о чем я говорю:
(чтобы воспроизвести ошибку, установите размер 70, затем выберите жирный шрифт, и вы увидите, как текст отходит от края.)
public class Main extends Application {
public void start(Stage stage) {
textArea = new TextArea("TEST 112123");
textArea.setPrefWidth(800);
textArea.setPrefHeight(400);
textArea.setLayoutY(40);
CheckBox bold = new CheckBox("BOLD");
bold.setLayoutX(20);
bold.setOnAction(e -> {
Font currentFont = textArea.getFont();
if (bold.isSelected()) {
textArea.setFont(
new Font("System Bold", currentFont.getSize()));
//I set new Font each time to save all of it's past properties and
//change only one of them, this is the only way that I found to do
//this as there are no setters in the Font class, only constructors
} else {
textArea.setFont(
new Font("System", currentFont.getSize()));
}
});
ComboBox sizeBox = new ComboBox();
//I removed the list of options and the input validity check
sizeBox.setLayoutX(80);
sizeBox.setEditable(true);
sizeBox.setOnAction(e -> {
textArea.setFont(new Font(textArea.getFont().getName(),
Double.valueOf((String)sizeBox.getValue())));
});
stage.setScene(new Scene(new Group(textArea, bold, sizeBox), 800, 500));
stage.show();
}
}
изображений: https://imgur.com/a/Cg53nAL