JavaFX的取决于它的内容2文本区域,改变高度(JavaFX 2 TextArea that ch

2019-09-30 09:03发布

在JavaFX 2.2,有没有什么办法让文本区域(与setWrapText(真)和恒定maxWidth)根据内容改变其高度?

所需的行为:当用户键入需要另一条线路,当它调整大小,并在需要的线没有更多的降低文本区域里面的东西。

还是有可能在这种情况下使用更好的JavaFX的控制?

Answer 1:

您可以将绑定prefHeight文本区域的它包含文本的高度。 这是一个黑客位的,因为你需要lookup来获得包含在文本区域中的文本,但它似乎工作。 你需要确保你查找的text CSS已经被应用后节点。 (通常,这意味着它已经出现在屏幕上后...)

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ResizingTextArea extends Application {

    @Override
    public void start(Stage primaryStage) {
        TextArea textArea = new TextArea();
        textArea.setWrapText(true);

        textArea.sceneProperty().addListener(new ChangeListener<Scene>() {
            @Override
            public void changed(ObservableValue<? extends Scene> obs, Scene oldScene, Scene newScene) {
                if (newScene != null) {
                    textArea.applyCSS();
                    Node text = textArea.lookup(".text");
                    textArea.prefHeightProperty().bind(Bindings.createDoubleBinding(new Callable<Double>() {
                        @Override
                        public Double call() {
                            return 2+text.getBoundsInLocal().getHeight();
                        }
                    }), text.boundsInLocalProperty()));
                }
            }
        });

        VBox root = new VBox(textArea);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }
}


Answer 2:

有两件事情要添加到James_D的答案(因为我缺乏代表评论):

1)对于大字体大小一样36+,文本区域大小是错误的,但是也会纠正自己,当我的文字区域内点击。 您可以拨打textArea.layout()应用CSS之后,但在文本区仍最大化窗口后并不会立即调整。 为了解决这个问题,请致电textArea.requestLayout()的任何变化之后,非同步的变化监听Text对象的局部范围。 见下文。

2)文本区域仍然是几个像素短期和滚动条仍然清晰可见。 如果更换2textArea.getFont().getSize()的结合,高度非常适合于文本,无论字体大小是微小或巨大的。

class CustomTextArea extends TextArea {
    CustomTextArea() {
        setWrapText(true);
        setFont(Font.font("Arial Black", 72));

        sceneProperty().addListener((observableNewScene, oldScene, newScene) -> {
            if (newScene != null) {
                applyCss();
                Node text = lookup(".text");

                // 2)
                prefHeightProperty().bind(Bindings.createDoubleBinding(() -> {
                    return getFont().getSize() + text.getBoundsInLocal().getHeight();
                }, text.boundsInLocalProperty()));

                // 1)                   
                text.boundsInLocalProperty().addListener((observableBoundsAfter, boundsBefore, boundsAfter) -> {
                    Platform.runLater(() -> requestLayout());
                });
            }
        });
    }
}

(以上编译为Java 8.对于Java 7,根据JavaFX的API替换变化监听听者lambda表达式,并更换空()->与lambda表达式Runnable )。



文章来源: JavaFX 2 TextArea that changes height depending on its contents