【发布时间】:2018-03-19 04:13:18
【问题描述】:
我想知道是否有办法在 JavaFX 中屏蔽 TextArea 的文本。
例如,使用像PasswordField 这样的“子弹”密码字符来屏蔽文本。对于TextField,有一个很好用的maskText() 方法。此方法对TextArea 没有用处。
我能做些什么?
注意:我希望 getText() 和 setText() 方法必须适用于明文,而不是屏蔽文本。就像PasswordField 一样。
编辑
这是我用来达到结果的方法,但不幸的是没有成功。
我的自定义TextArea 类:
public class PasswordArea extends TextArea {
@Override
protected Skin<?> createDefaultSkin() {
return new PasswordAreaSkin(this); //my custom skin
}
}
用于自定义TextArea的自定义皮肤:
public class PasswordAreaSkin extends TextAreaSkin {
public PasswordAreaSkin(PasswordArea control) {
super(control);
}
//here I override the maskText method to mask the text
@Override
protected String maskText(String text) {
int n = text.length();
StringBuilder passwordBuilder=new StringBuilder(n);
for(int i = 0; i < n; i++) {
passwordBuilder.append('\u2022'); //append 'bullet' char
}
return passwordBuilder.toString();
}
}
【问题讨论】:
-
由于没有内置方法来屏蔽文本,您必须自己实现一个。为什么以及如何屏蔽
TextArea中的文本?整个文本还是部分文本(例如单个Strings)? -
我希望
TextArea中的所有文本都被PasswordField等“子弹”字符所掩盖。我试图创建一个自定义的TextArea,但未成功覆盖maskText()方法。 -
你不能重写超类中不存在的方法,可以吗?请在一个最小的工作(或失败)示例中提供您迄今为止编写的代码。我的第一种方法是扩展
TextArea,它有一个成员(可能只是一个String),它包含真实的文本,并编写一个方法maskText(),用一个项目符号替换每个字符。 -
maskText()方法是TextInputControlSkin类的方法我创建了一个自定义TextArea,其自定义皮肤扩展了TextAreaSkin(这是TextInputControlSkin的子类)跨度> -
这里提供代码的另一个原因 ;-) 展示你的方法,如果它只是包含一个小错误,你很有可能与这个社区一起解决这个问题。