我试图限制可以插入到 JavaFX-8 TextField 中的字符数:达到限制时调用 endLineReached() 方法。 我想根据文本字段的大小(GUI 上的可见部分)设置最大字符数。所以我使用的代码是
textfield.textProperty().addListener((ov, oldValue, newValue) -> {
onEndLine(textfield.getText(), textfield.getPrefColumnCount());
});
public void onEndLine(String text, int prefColumnCount) {
if (text.length() > prefColumnCount) {
endLineReached();
}
}
问题是 textfield.getPrefColumnCount() 无法正常工作。此外,我无法以编程方式设置 prefColumnCount 值,因为每次重新启动程序时(而不是在执行期间),文本字段宽度可能会发生变化。该文本字段是 JavaFX HBox 的子项。
最佳答案
如果您想仅根据文本字段的视觉宽度来限制文本的长度,这有点棘手,因为它取决于许多因素(字体、文本字段的宽度、应用于文本字段的填充)文本字段,如果是可变宽度字体,则为已输入的实际文本等)。
请注意,这似乎是一件奇怪的事情(imo),因为如果恰好使用窄字符,用户将能够输入相对较长的文本,但如果恰好使用宽字符,用户将能够输入相对较短的文本(在下面的示例中)我可以输入 26 个“l”,但只能输入 8 个“m”)。实际上,允许用户输入的文本应该基于逻辑考虑(即业务规则),而不是视觉考虑。但也许您对此有一些不寻常的用例。
您可以使用 text formatter在文本字段上否决添加文本。要检查宽度,请使用新文本创建一个新的 Text
对象,将字体设置为与文本字段相同的字体,然后检查其宽度。您还需要考虑文本字段中的填充。请注意,这有点脆弱,因为您并不真正了解文本字段布局的实现,但这似乎工作正常,至少对于我拥有的 JDK 版本是这样。
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.control.TextInputControl;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class TextFieldNoScroll extends Application {
@Override
public void start(Stage primaryStage) {
TextField textField = new TextField();
textField.setTextFormatter(new TextFormatter<String>(change -> {
if (change.isAdded()) {
Insets textFieldInsets = change.getControl().getPadding();
double horizPadding = textFieldInsets.getLeft() + textFieldInsets.getRight() ;
Text newText = new Text(change.getControlNewText());
newText.setFont(((TextInputControl)change.getControl()).getFont());
double newTextWidth = newText.getBoundsInLocal().getWidth();
if (newTextWidth + horizPadding > change.getControl().getWidth()) {
return null ;
}
}
return change ;
}));
VBox root = new VBox(textField);
root.setAlignment(Pos.CENTER);
Scene scene = new Scene(root, 120, 120);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
关于JavaFX-8:限制文本字段中的字符数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34567300/