gpt4 book ai didi

java - 如何计算javafx文本区域中的行数

转载 作者:行者123 更新时间:2023-12-02 04:45:12 25 4
gpt4 key购买 nike

如果文本换行设置为关闭,那么这当然是一件小事,因为可以通过计算换行符的数量轻松计算行数。不幸的是,当启用文本换行时,除了在初始化框时在每一行的末尾实际放置换行符之外,似乎没有任何明显且不困惑的方法来执行此操作。

到目前为止,这就是我解决问题的方法,但是这是非常不可取的,因为在许多情况下,它会在单词中间插入换行符,当然,这个解决方案是令人费解和困惑的。有没有人有什么建议?如果我将文本区域包裹在 textflow 容器中,有没有办法解决这个问题?

最佳答案

我遇到了同样的问题。经过一番挖掘,我找到了 this thread其中有您正在寻找的答案。

它使用 Label保存文TextArea并随着标签高度的改变而更新其高度。这是一个完整的演示:

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.GroupBuilder;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.StackPaneBuilder;

public class ScrollFreeTextArea extends StackPane{

private Label label;
private StackPane lblContainer ;
private TextArea textArea;

private Character NEW_LINE_CHAR = new Character((char)10);
private final double NEW_LINE_HEIGHT = 18D;
private final double TOP_PADDING = 3D;
private final double BOTTOM_PADDING = 6D;

public ScrollFreeTextArea(){
super();
configure();
}

public ScrollFreeTextArea(String text){
super();
configure();
textArea.setText(text);
}

private void configure(){
setAlignment(Pos.TOP_LEFT);

this.textArea =new TextArea();
this.textArea.setWrapText(true);
this.textArea.getStyleClass().add("scroll-free-text-area");


this.label =new Label();
this.label.setWrapText(true);
this.label.prefWidthProperty().bind(this.textArea.widthProperty());
this.label.textProperty().bind(this.textArea.textProperty());

this.lblContainer = StackPaneBuilder.create()
.alignment(Pos.TOP_LEFT)
.padding(new Insets(4,7,7,7))
.children(label)
.build();
// Binding the container width to the TextArea width.
lblContainer.maxWidthProperty().bind(textArea.widthProperty());

textArea.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> paramObservableValue, String paramT1, String value) {
layoutForNewLine(textArea.getText());
}
});

label.heightProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> paramObservableValue, Number paramT1, Number paramT2) {
layoutForNewLine(textArea.getText());
}
});

getChildren().addAll(GroupBuilder.create().children(lblContainer).build(),textArea);
}

private void layoutForNewLine(String text){
if(text!=null && text.length()>0 &&
((Character)text.charAt(text.length()-1)).equals(NEW_LINE_CHAR)){
textArea.setPrefHeight(label.getHeight() + NEW_LINE_HEIGHT + TOP_PADDING + BOTTOM_PADDING);
textArea.setMinHeight(label.getHeight() + NEW_LINE_HEIGHT + TOP_PADDING + BOTTOM_PADDING);
}else{
textArea.setPrefHeight(label.getHeight() + TOP_PADDING + BOTTOM_PADDING);
textArea.setMinHeight(label.getHeight() + TOP_PADDING + BOTTOM_PADDING);
}
}

}

关于java - 如何计算javafx文本区域中的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33666020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com