Динамическое изменение шрифта метки в JavaFXJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Динамическое изменение шрифта метки в JavaFX

Сообщение Anonymous »

Я работаю над калькулятором на основе JavaFX, который определяется этим файлом FXML: В CSS-файле метки resultText, которая отвечает за отображение результатов операций на экране, в CSS-файле установлен шрифт размером 70 пикселей:

Код: Выделить всё

.label-resultado {
-fx-text-fill: #ffffff;
-fx-font-size: 70;
-fx-font-family: 'Hind Siliguri Medium';
}
Чтобы облегчить форматирование, я определил в своем классе Controller переменную и метод, которые всегда форматируют результаты до 5 десятичных знаков для отображения в метке resultText.
Чтобы облегчить форматирование, я определил в своем классе Controller переменную и метод, которые всегда форматируют результаты до 5 десятичных знаков для отображения в метке resultText.
p>
Однако у меня есть методы обработки ошибок (например, когда пользователь пытается разделить число на 0), которые выбрасываются в мою метку resultText и в качестве размера корня по умолчанию (и открытого окно приложения) достаточно малы, чтобы вместить все, большая часть текста опущена:
Он не помещается во всю этикетку
Чтобы обойти это , также в Контроллере я создал метод, который при отображении ошибки автоматически уменьшает шрифт до 20, чтобы все сообщение об ошибке уместилось на экране. Однако это решение не решает проблему, когда весь текст не помещается на экране, например, если пользователь вводит большое количество.
Поэтому мне бы хотелось способ динамического изменения размера шрифта метки, когда это необходимо, чтобы текст всегда помещался в нее, независимо от размера окна. Я уже пробовал использовать это решение, установив MAX_TEXT_WIDTH на ширину VBox, в котором содержится метка (поэтому, если размер окна был изменен, максимальный размер метки изменится вместе с ней - или я так думал), но это вообще не сработало.
Вот мой класс 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);
};
}
}
Опять же, мне нужен способ динамического изменения размера шрифта в случае, если в resultText отображается ошибка или пользователь вводит большое количество, сохраняя его совместимость при изменении размера окна. Заранее прошу прощения за любые ошибки в написании, так как я не являюсь носителем английского языка. Я также сейчас начинаю изучать JavaFX, поэтому я не эксперт. Заранее спасибо!

Подробнее здесь: https://stackoverflow.com/questions/791 ... -in-javafx
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»