Layout 将TextArea高度绑定到其内容

Layout 将TextArea高度绑定到其内容,layout,binding,textarea,javafx,Layout,Binding,Textarea,Javafx,JavaFX:是否可以将TextAreaheight(行数)绑定到其内容的高度? 我想在编写文本时动态更改TextArea的高度。看看。虽然这不是一个使用绑定的解决方案,computeTextHeight(字体、字符串文本、双包装宽度)方法可以帮助您。一个在javafx8中工作良好的解决方案(隐藏工具栏的灵感来自): 这是一个精确、简单且有效的解决方案: SimpleIntegerProperty count = new SimpleIntegerProperty(20); int rowHei

JavaFX:是否可以将
TextArea
height(行数)绑定到其内容的高度?

我想在编写文本时动态更改
TextArea
的高度。

看看。虽然这不是一个使用绑定的解决方案,
computeTextHeight(字体、字符串文本、双包装宽度)
方法可以帮助您。

一个在javafx8中工作良好的解决方案(隐藏工具栏的灵感来自):


这是一个精确、简单且有效的解决方案:

SimpleIntegerProperty count = new SimpleIntegerProperty(20);
int rowHeight = 10;

txtArea.prefHeightProperty().bindBidirectional(count);
txtArea.minHeightProperty().bindBidirectional(count);
txtArea.scrollTopProperty().addListener(new ChangeListener<Number>(){
    @Override
    public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) {
        if(newVal.intValue() > rowHeight){
            count.setValue(count.get() + newVal.intValue());
        }
    }
});

这是不够的。首先,如果你一直滚动在文本区域的顶部(因此滚动顶部保持为零),它将永远不会扩展到所需的大小。尼尔·布朗你在投票前试过这个吗?你似乎不懂逻辑。scrollTop在写入长度>文本区域宽度的文本时增加。因此,计数增加,区域高度增加。这反过来会将scrollTop设置为零。如果在ChangeListener中打印newval.intValue(),您将了解发生了什么。打印的值看起来像:16 0 16 0 16 0…我的观点是你不能“滚动”,因为没有滚动条,因为在文本区域高度增加后scrollTop被重置为0。你是对的:我不知道scrollTop会做什么。然而,我已经尝试了代码——当我在空白文本框中按Enter以生成空白的新行时,滚动条出现,并且高度增加,但通常不足以摆脱滚动条。现在我看到,在空白行上键入文本会导致高度得到纠正。当我按backspace键删除这些行时,scrollTop永远不会被修改,因此字段永远不会缩小到合适的位置——这对我来说是必需的,但对原始提问者来说可能不是。试图删除我的否决票,但它被锁定,除非答案被编辑。我尝试过这个解决方案,但我发现我得到反弹的大小;当库试图显示滚动条时,当我编辑文本时,窗口的高度似乎会上下反弹。JavaFX没有适合TextArea属性的大小,这太令人恼火了!
SimpleIntegerProperty count = new SimpleIntegerProperty(20);
int rowHeight = 10;

txtArea.prefHeightProperty().bindBidirectional(count);
txtArea.minHeightProperty().bindBidirectional(count);
txtArea.scrollTopProperty().addListener(new ChangeListener<Number>(){
    @Override
    public void changed(ObservableValue<? extends Number> ov, Number oldVal, Number newVal) {
        if(newVal.intValue() > rowHeight){
            count.setValue(count.get() + newVal.intValue());
        }
    }
});
SimpleIntegerProperty count=new SimpleIntegerProperty(20);
int rowHeight = 10;

textArea.prefHeightProperty().bindBidirectional(count);
textArea.minHeightProperty().bindBidirectional(count);
textArea.scrollTopProperty().addListener((ov, oldVal, newVal) -> {
    if(newVal.intValue() > rowHeight){
        count.setValue(count.get() + newVal.intValue());
    }
});