在JavaFX 2.2,有没有什么办法让文本区域(与setWrapText(真)和恒定maxWidth)根据内容改变其高度?
所需的行为:当用户键入需要另一条线路,当它调整大小,并在需要的线没有更多的降低文本区域里面的东西。
还是有可能在这种情况下使用更好的JavaFX的控制?
在JavaFX 2.2,有没有什么办法让文本区域(与setWrapText(真)和恒定maxWidth)根据内容改变其高度?
所需的行为:当用户键入需要另一条线路,当它调整大小,并在需要的线没有更多的降低文本区域里面的东西。
还是有可能在这种情况下使用更好的JavaFX的控制?
您可以将绑定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);
}
}
有两件事情要添加到James_D的答案(因为我缺乏代表评论):
1)对于大字体大小一样36+,文本区域大小是错误的,但是也会纠正自己,当我的文字区域内点击。 您可以拨打textArea.layout()
应用CSS之后,但在文本区仍最大化窗口后并不会立即调整。 为了解决这个问题,请致电textArea.requestLayout()
的任何变化之后,非同步的变化监听Text
对象的局部范围。 见下文。
2)文本区域仍然是几个像素短期和滚动条仍然清晰可见。 如果更换2
与textArea.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
)。