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



如果文本换行设置为关闭,那么这当然是一件小事,因为通过计算换行字符的数量可以很容易地计算行数。不幸的是,当启用文本换行时,似乎没有任何明显的和非混乱的方法来做到这一点,除了在初始化框时在每一行的末尾添加换行符之外。

到目前为止,这就是我解决问题的方法,但这是非常不可取的,因为在许多情况下,它会在单词中间插入换行符,当然,这种解决方案是复杂而混乱的。有人有什么建议吗?如果我把我的文本区域包装在一个文本流容器中,会有办法绕过它吗?

我也遇到了同样的问题。经过一番挖掘,我找到了这个线索,它有你正在寻找的答案。

它使用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);
          }
     }
}

从您的TextArea

TextArea textArea = new TextArea();

取文本

String toCount = textArea.getText();

将其拆分为行

String[] lineArray = toCount.split("n");

lineArray.length -1的索引0是您的行,其中lineArray.length -1是您的总数。

如何在Java 中拆分字符串

如果你想让它们看起来好看,你如何插入行计数是另一回事。

相关内容

  • 没有找到相关文章

最新更新