【发布时间】:2020-01-30 03:45:29
【问题描述】:
我们正在尝试计算 TextArea 中的行数
这是 TextArea 属性 PrefWidth 600 和 PrefHeight 620 和 MaxHeight 620
Wrap Text 设置为 true。我们将 JavaFX 8 与 Scene Builder 一起使用
我们有一个 textPropertyListiner,它会在 TextArea.getLength 大于某个值时触发警报
此方法的问题是它不考虑用户输入回车 \n
所以我们实现了这段代码来捕获\n
String toCount = txaDiaryEntry.getText();
String [] lineArray = toCount.split("\n");
int LA = lineArray.length - 1;
if(LA == 0){
rc = rc - 1;
System.out.println("###### LA "+LA+" RC "+rc);
}
if 测试始终为零,因此每次用户在输入一个回车后键入任何内容时都会运行此测试
此代码在 textPropertyListiner
内
当输入的文本进行换行时,不会创建 \n
我们查看了许多旧帖子并尝试了一些没有结果的示例
问题是如何计算具有回车符和换行符的 TextArea 中的行数为真?
在我进行测试时,我注意到发布代码的一些问题是 LA 值继续增加。因为我们很少使用 Array 我的猜测是当值达到 1 时需要清除 Array
因此,如果有人愿意解释如何使用此 String[] 数组来完成此操作,我们将对其进行测试
我们已经编辑了问题代码,以反映计算两个换行和当用户按下 ENTER 键时的工作示例。虽然这可行,但我们可能会补充一点,使用行计数来防止进一步的文本输入不如计算 TextArea 中的字符数有利。
@Override
public void initialize(URL url, ResourceBundle rb) {
txtTitle.setStyle("-fx-text-fill: black;");
getDate();
if(doEDIT.equals("TRUE")){
btnEdit.setVisible(true);
btnSave.setVisible(false);
try {
ReadChildTable();
} catch (SQLException ex) {
Logger.getLogger(EnterController.class.getName()).log(Level.SEVERE, null, ex);
}
}
try {
ReadParent();
} catch (SQLException | IOException ex) {
Logger.getLogger(EnterController.class.getName()).log(Level.SEVERE, null, ex);
}
txaDiaryEntry.textProperty().addListener((observable, oldValue, newValue) -> {
EC = txaDiaryEntry.getLength();
tEC = tEC + 1;
// this counts line wraps every 62 char
if(tEC == 62){
RC = RC - 1;
tEC = 0;
}
// This counts ENTER key presses
String toCount = txaDiaryEntry.getText();
String [] lineArray = toCount.split("\n");
LA = lineArray.length - 1;
if(LA == tLA){
tLA = LA + 1;
RC = RC - 1;
}else if(tLA < LA){
tLA = LA + 1;
RC = RC - (LA - 1);
}else{
}
// This test counter
int minus = EC+(LA * 40);
int val = 1200 - minus ;
txtCR.setText(String.valueOf(val));
uEC = uEC - val;
if(LA == 0){
uEC = 1200;
}else{
uEC = 960;// 880
}
if(EC > uEC){
//if(RC == 0){
alertTYPE = "4";
//RC = RC + 1;
try {
customAlert();
} catch (IOException ex) {
Logger.getLogger(EnterController.class.getName()).log(Level.SEVERE, null, ex);
}
txaDiaryEntry.requestFocus();
}
});
}
请查看代码中的 cmets,因为此方法管理其他任务。
【问题讨论】:
-
可能我有点困惑..您是否希望输入文本中的行数(即由\n分隔)或可见行/行数在textarea中使用(因为 textwrap 和 \n)?
-
@SaiDandem 我们想要捕获用户按下 ENTER 时创建的 \n 的数量,并从预设的 RowCount 中减去我们可以计算用户只是键入时创建的行数 Issue is not able重置或清除字符串[],如我对问题的编辑中所述,它不断增加
-
@SaiDandem 我们尝试了这段代码但没有运气 lineArray = null
-
不确定到底是什么问题。因为对我来说,添加这段代码给了我正确的行数。可能你能提供一个Minimal, Reproducible Example textArea.textProperty().addListener((obs,old,txt)->{ System.out.println(txt.split("\n").length); });
-
您的要求并不完全清楚。你想计算有多少文字行分隔符,文本在屏幕上被换行多少次,还是两者兼而有之?请注意,文本换行纯粹是一种渲染“技巧”,不会导致在文本中插入行分隔符。您必须根据字符的宽度和换行宽度计算一行文本的换行次数。问题在于 JavaFX 没有提供公共 API 来根据字体测试字符的宽度——至少在 JavaFX 13 中没有。