基于 JavaFX 中 child 的 Textnode 内容增加 BorderPane
Growing BorderPane based on child's Textnode content in JavaFX
我在弄清楚最好的程序是什么时遇到了问题,要有一个增长和收缩 BorderPane
。我想尝试根据它具有的 Text
节点 child(更改文本长度)水平放大或缩小窗格。我必须考虑一些额外的限制/问题:
- 不能使用
Label
,因为它们在 3D 场景中渲染效果更差。即使打开或关闭液晶显示器/灰色/缓存。
- 如果文本长度大于其边界框宽度,文本节点会换行
- 使用
setWrappingWidth(0)
自动右对齐文本节点而不是我需要的水平居中对齐。
- 使用
setWrappingWidht(Double.MAX_VALUE)
在 3D 场景中使用相机经过时会抛出异常。
- 还没有弄清楚如何实际设置节点的宽度。我可以用
getLayoutBounds().getWidth()
. 得到它
- 文本节点 class 似乎没有任何可用的宽度绑定?
浏览了一段时间后,我找到了这个答案:Javafx textfield resize to text lenght?它包含一个计算文本宽度的方法。我将 BorderPane
更改为包含 VBox
,后者又包含 TextField
。但是,它也应该通过为 Text
节点设置 setWrappingWidth
来工作。
TextUtils
class 我从上面复制的 link.
public TextField getTop() {
Node topNode = this.borderPane.getTop();
if((topNode instanceof VBox)) {
VBox topVBox = (VBox) topNode;
if(!topVBox.getChildren().isEmpty() && topVBox.getChildren().get(0) instanceof TextField) {
return (TextField) topVBox.getChildren().get(0);
}
}
return null;
}
public void adaptWidthByText(Font font, String text) {
// + 50px for some additional space to compensate insets, borders etc.
double newWidth = TextUtils.computeTextWidth(font, text, 0.0D) + 50;
this.borderPane.setPrefWidth(newWidth);
}
public void setTopText(String text) {
TextField topTextField = getTop();
if(topTextField == null) return;
adaptWidthByText(topTextField.getFont(), text);
topTextField.setText(text);
}
我在弄清楚最好的程序是什么时遇到了问题,要有一个增长和收缩 BorderPane
。我想尝试根据它具有的 Text
节点 child(更改文本长度)水平放大或缩小窗格。我必须考虑一些额外的限制/问题:
- 不能使用
Label
,因为它们在 3D 场景中渲染效果更差。即使打开或关闭液晶显示器/灰色/缓存。 - 如果文本长度大于其边界框宽度,文本节点会换行
- 使用
setWrappingWidth(0)
自动右对齐文本节点而不是我需要的水平居中对齐。 - 使用
setWrappingWidht(Double.MAX_VALUE)
在 3D 场景中使用相机经过时会抛出异常。 - 还没有弄清楚如何实际设置节点的宽度。我可以用
getLayoutBounds().getWidth()
. 得到它
- 文本节点 class 似乎没有任何可用的宽度绑定?
浏览了一段时间后,我找到了这个答案:Javafx textfield resize to text lenght?它包含一个计算文本宽度的方法。我将 BorderPane
更改为包含 VBox
,后者又包含 TextField
。但是,它也应该通过为 Text
节点设置 setWrappingWidth
来工作。
TextUtils
class 我从上面复制的 link.
public TextField getTop() {
Node topNode = this.borderPane.getTop();
if((topNode instanceof VBox)) {
VBox topVBox = (VBox) topNode;
if(!topVBox.getChildren().isEmpty() && topVBox.getChildren().get(0) instanceof TextField) {
return (TextField) topVBox.getChildren().get(0);
}
}
return null;
}
public void adaptWidthByText(Font font, String text) {
// + 50px for some additional space to compensate insets, borders etc.
double newWidth = TextUtils.computeTextWidth(font, text, 0.0D) + 50;
this.borderPane.setPrefWidth(newWidth);
}
public void setTopText(String text) {
TextField topTextField = getTop();
if(topTextField == null) return;
adaptWidthByText(topTextField.getFont(), text);
topTextField.setText(text);
}