【问题标题】:how to count lines in javafx text area如何计算javafx文本区域中的行数
【发布时间】:2015-11-12 07:11:12
【问题描述】:

如果文本换行设置为关闭,那么这当然是一件小事,因为可以通过计算换行符的数量来轻松计算行数。不幸的是,当文本换行打开时,似乎没有任何 明显 和非混乱的方法来做到这一点,除了在初始化框时在每行的末尾实际放入换行符。

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

【问题讨论】:

  • 我已经对此进行了一些挖掘......实际布局是在“皮肤”中完成的,即TextAreaSkin......你可以从area.getSkin()的向下转换中获得。 .. 有可能你可以从那里得到行数,但不知道如何......我知道很乱......并且由于 TextAreaSkin 是 sun.com 的私人东西而受到破坏......
  • 非常感谢您的领导。我会自己挖一些。如果您发现其他任何信息,请告诉我。对于我可以在哪里阅读更多关于“sun.com 私人资料”(例如 textareaskin)的信息,您有什么建议/好的资源吗?这可能正是我需要做的才能让它工作......
  • 其他几个 cmets:在 Java 9 中,TextAreaSkin 将是公共 API。但是请注意包名称会更改。因此,如果可以,您可能希望使用 EA 版本开始针对该版本进行编码。有一个getCharacterBounds(int offset) 方法,至少在理论上你可以用它来计算有多少行(计算边界的不同 y 值的数量,以获得一些合适的“不同”定义)。或者您可以对其进行子类化并定义您自己的皮肤类来跟踪行数。无论哪种方式,使用 Java 9 都可能有所帮助。
  • 而且如果可以使用第三方库,RichTextFX中的皮肤类也是公开的。
  • 您能告诉我更多关于如何在 Scene Builder 2.0 中使用 RichTextFX 的信息吗?我去了 Import-->FXML,但它似乎无法识别或添加富文本控件...

标签: java netbeans javafx textarea scenebuilder


【解决方案1】:

我遇到了同样的问题。经过一番挖掘,我找到了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);
          }
     }

}

【讨论】:

    【解决方案2】:

    来自您的文本区域

    TextArea textArea = new TextArea();

    取文字

    String toCount = textArea.getText();

    把它分成几行

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

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

    How to split a string in Java

    如果您希望它们可见,如何插入行数是另一回事。

    【讨论】:

      猜你喜欢
      • 2021-07-11
      • 2012-04-21
      • 2012-12-14
      • 2016-10-22
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      相关资源
      最近更新 更多