Установка цвета текста в javaFX TextField "Без использования CSS" - PullRequest
0 голосов
/ 04 ноября 2018

Если вы собираетесь предложить CSS, тогда не беспокойтесь, я знаю, что он отлично работает и очень прост в использовании, это просто из любопытства и из-за того, что я ненавижу работать с CSS во время кодирования в Java.

JavaFX TextField косвенно расширяет Parent, который имеет «немодифицируемый» ObservableList потомков типа Node, и один из них должен иметь тип Text, поэтому я расширил класс TextField и написал два метода для проверки, этот метод для получения все дети вышли из TextField.

public ArrayList<Node> getAllChildren(Parent parent) {
    ArrayList<Node> res = new ArrayList<Node>();
    for (Node n : parent.getChildrenUnmodifiable()) {
        if (n instanceof Parent) {
            res.addAll(getAllChildren((Parent) n));
        } else {
            res.add(n);
        }
    }
    return res;
}

Это распечатка результата.

public void printChildren() {
    ArrayList<Node> nodes = getAllChildren(this);
    System.out.println("size = "+nodes.size()+" {");
    for (Node n : nodes) {
        System.out.println("    "+n.getClass().getSimpleName());
    }
    System.out.println('}');
}

Результат вполне ожидаемый.

size = 3 {
    Path
    Text
    Path
}

Итак, я написал этот метод для получения только объекта Text.

private Text findText(Parent parent) {
    for (Node n : parent.getChildrenUnmodifiable()) {
        if (n instanceof Text) {
            return (Text) n;
        } else if (n instanceof Parent) {
            Text p = findText((Parent) n);
            if (p != null) {
                return p;
            }
        }
    }
    return null;
}

Он работал нормально и возвращал объект Text.

Так что мне нужно было только установить Fill, и все будет готово.

public void setTextFill(Paint p) {
    findText(this).setFill(p);
}

Но всякий раз, когда я пытаюсь установить textFill, я получаю RuntimeException, которое говорит:

Text.fill : A bound value cannot be set

Это немного долго, чтобы идти в ногу с настройкой только цвета для текста.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 04 ноября 2018

Внутренние элементы Control s скрыты специально. В этом случае текстовое заполнение узла Text обновляется с помощью привязки. Если вы не отсоедините свойство fill узла перед его настройкой (text.fillProperty().unbind()), установка значения завершится неудачей.

Если вы хотите возиться с ними, вы должны сделать это, используя Skin. Предполагая, что вы используете JavaFX версии 9 или новее, обложка для TextField является частью общедоступного API, и вы можете получить доступ к свойству textFill, расширив его:

@Override
public void start(Stage primaryStage) {
    TextField textField = new TextField();

    textField.setSkin(new TextFieldSkin(textField) {
        {
            // use red color for text
            setTextFill(Color.RED);
        }

    });

    StackPane root = new StackPane(textField);

    Scene scene = new Scene(root, 500, 500);

    primaryStage.setScene(scene);
    primaryStage.show();
}

Если вам нужен подтип TextField с общедоступным свойством fill, добавьте такое свойство JavaFX в свой подкласс и переопределите метод createDefaultSkin, чтобы он возвращал подкласс TextFieldSkin, создавая привязку для его textFill собственность.

...