Код: Выделить всё
Код: Выделить всё
.label-resultado {
-fx-text-fill: #ffffff;
-fx-font-size: 70;
-fx-font-family: 'Hind Siliguri Medium';
}
Чтобы облегчить форматирование, я определил в своем классе Controller переменную и метод, которые всегда форматируют результаты до 5 десятичных знаков для отображения в метке resultText.
p>
Однако у меня есть методы обработки ошибок (например, когда пользователь пытается разделить число на 0), которые выбрасываются в мою метку resultText и в качестве размера корня по умолчанию (и открытого окно приложения) достаточно малы, чтобы вместить все, большая часть текста опущена:
Он не помещается во всю этикетку
Чтобы обойти это , также в Контроллере я создал метод, который при отображении ошибки автоматически уменьшает шрифт до 20, чтобы все сообщение об ошибке уместилось на экране. Однако это решение не решает проблему, когда весь текст не помещается на экране, например, если пользователь вводит большое число.
Вот мой класс Controller с соответствующей информацией ( это МИНИМАЛЬНЫЙ ПРИМЕР, КОТОРЫЙ Я МОГУ РАЗМЕСТИТЬ. Здесь больше ничего нельзя опустить, поскольку это базовый код для воспроизведения моей проблемы):
Код: Выделить всё
public class CalculadoraController {
private Scene scene;
private final NumberFormat FORMAT = NumberFormat.getInstance(Locale.forLanguageTag("pt-BR"));
private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#,##0.#####");
public CalculatorModel calculator = new CalculatorModel();
@FXML
private Button buttonDivide, buttonMultiply, buttonSubtract, buttonAdd, buttonEqual, buttonSquare, buttonPercentage;
@FXML
private Label resultText, reviewText;
@FXML
private void initialize() {
resultText.setText("");
reviewText.setText("");
}
// Handle clicks on number buttons
public void numberButtonClicked(ActionEvent click) {
String value = ((Button) click.getSource()).getText();
handleNumbers(value);
}
public void handleNumbers(String number) {
resultText.setText(resultText.getText() + number);
}
// Handle clicks on one of the operation buttons
public void operationButtonClicked(ActionEvent actionEvent) throws ParseException {
char temporaryOperator = '\0';
if (actionEvent.getSource() == buttonAdd) {
temporaryOperator = '+';
} else if (actionEvent.getSource() == buttonSubtract) {
temporaryOperator = '-';
} else if (actionEvent.getSource() == buttonMultiply) {
temporaryOperator = 'x';
} else if (actionEvent.getSource() == buttonDivide) {
temporaryOperator = '/';
} else if (actionEvent.getSource() == buttonSquare) {
temporaryOperator = '^';
} else if (actionEvent.getSource() == buttonPercentage) {
temporaryOperator = '%';
}
if (!resultText.getText().isEmpty()) {
double number = FORMAT.parse(resultText.getText()).doubleValue();
calculator.setNum1(number);
}
calculator.setOperator(temporaryOperator);
reviewText.setText(formatResult(calculator.getNum1()) + " " + calculator.getOperator());
resultText.setText("");
calculator.setOperatorSelected(true);
calculator.setResultCalculated(false);
}
// It's here the error is caught and passed to the handler method
public void equalButtonClicked() {
try {
if (!resultText.getText().isEmpty()) {
double num2 = FORMAT.parse(resultText.getText()).doubleValue();
if (calculator.getOperator() != '\0') {
calculator.setNum2(num2);
reviewText.setText(formatResult(calculator.getNum1()) + " " +
calculator.getOperator() + " "
+ formatResult(calculator.getNum2()) + " =");
calculator.setResult(calculator.defineOperation(calculator.getNum1(),
calculator.getOperator(), calculator.getNum2()));
resultText.setText(formatResult(calculator.getResult()));
calculator.setNum1(calculator.getResult());
}
}
calculator.setOperatorSelected(false);
calculator.setResultCalculated(true);
} catch (ArithmeticException | ParseException e) {
displayError(e.getMessage());
}
}
// Shows the error on resultText
private void displayError(String errorMessage) {
resultText.setStyle("-fx-font-size: " + 20 + "px;");
resultText.setText(errorMessage);
calculator.setOperatorSelected(false);
calculator.setResultCalculated(true);
calculator.setDisplayingError(true);
}
// Formats the numbers to 5 decimal points
private String formatResult(double value) {
return (value % 1 != 0) ? DECIMAL_FORMAT.format(value) : DECIMAL_FORMAT.format((int) value);
}
Код: Выделить всё
public class CalculatorModel {
private double num1;
private char operator;
private boolean operatorSelected = false;
private double num2;
private double result;
private boolean resultCalculated = false;
private boolean displayingError = false;
public double getNum1() {
return num1;
}
public void setNum1(double num1) {
this.num1 = num1;
}
public char getOperator() {
return operator;
}
public void setOperator(char operator) {
this.operator = operator;
}
public double getNum2() {
return num2;
}
public void setNum2(double num2) {
this.num2 = num2;
}
// Part of the operator
public boolean isOperatorSelected() {
return operatorSelected;
}
public void setOperatorSelected(boolean operatorSelected) {
this.operatorSelected = operatorSelected;
}
public double getResult() {
return result;
}
public void setResult(double result) {
this.result = result;
}
public boolean isResultCalculated() {
return resultCalculated;
}
public void setResultCalculated(boolean resultCalculated) {
this.resultCalculated = resultCalculated;
}
public boolean isDisplayingError() {
return displayingError;
}
public void setDisplayingError(boolean displayingError) {
this.displayingError = displayingError;
}
// Methods used by the calculator
public double add(double num1, double num2) {
return num1 + num2;
}
public double subtract(double num1, double num2) {
return num1 - num2;
}
// Error thrown
public double divide(double num1, double num2) {
if (num2 == 0) {
throw new ArithmeticException("Cannot divide by zero");
}
return num1 / num2;
}
public double multiply(double num1, double num2) {
return num1 * num2;
}
public double calculatePower(double value1, double value2) {
return Math.pow(value1, value2);
}
public double calculatePercentageOfOne(double value, double percentage) {
return value * (percentage / 100);
}
public double defineOperation(double num1, char operator, double num2) {
return switch (operator) {
case '+' -> add(num1, num2);
case '-' -> subtract(num1, num2);
case 'x' -> multiply(num1, num2);
case '/' -> divide(num1, num2);
case '^' -> calculatePower(num1, num2);
case '%' -> calculatePercentageOfOne(num1, num2);
default -> throw new IllegalArgumentException("Unknown operation: " + operator);
};
}
}
Код: Выделить всё
public class CalculadoraController {
@FXML
private VBox textVbox;
@FXML
private void initialize() {
resultText.setText("");
reviewText.setText("");
double MAX_TEXT_WIDTH = textVbox.getWidth();
double defaultFontSize = 70; //same as on my css file
Font defaultFont = Font.font(defaultFontSize);
TextField tf = new TextField(resultText.getText());
resultText.setFont(defaultFont);
resultText.textProperty().addListener((observable, oldValue, newValue) -> {
Text tmpText = new Text(newValue);
tmpText.setFont(defaultFont);
double textWidth = tmpText.getLayoutBounds().getWidth();
if (textWidth
Подробнее здесь: [url]https://stackoverflow.com/questions/79142334/dynamically-changing-a-label-font-in-javafx[/url]
Мобильная версия