JavaFX:十六进制编码内容的自定义文本区域
我目前正试图在JavaFX中创建一个自定义文本区域,以便于输入十六进制编码的内容。主要限制因素包括:JavaFX:十六进制编码内容的自定义文本区域,java,javafx,textarea,Java,Javafx,Textarea,我目前正试图在JavaFX中创建一个自定义文本区域,以便于输入十六进制编码的内容。主要限制因素包括: 文本链接到一个属性,该属性包含字符串的二进制等价物(例如“ff”存储为{0xff}) 唯一有效的字符是十六进制数字(0123456789abcdef)。仅出于表示原因,大写数字变为小写(例如1Bd5显示为1Bd5) 该区域以两个字符块的形式显示十六进制字符串。 第三个要求是我发现大多数问题的地方。到目前为止,我所做的是在区域的textProperty中添加一个changeListener,以便每
属性
,该属性包含字符串的二进制等价物(例如“ff”
存储为{0xff}
)0123456789abcdef
)。仅出于表示原因,大写数字变为小写(例如1Bd5
显示为1Bd5
)textProperty
中添加一个changeListener
,以便每次更改字段上的文本时,保留格式。代码如下所示:
textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
String correctedNewValue = validated(newValue);
if (!correctedNewValue .equals(newValue))
textProperty().setValue(correctedNewValue);
}
});
到目前为止,我所看到的是,不应该在侦听器中更改检测同一属性更改的属性,一些来源建议使用Platform.runLater
。但是,这是非常不稳定的(插入符号改变位置-通常是字段的开头-有时焦点会丢失)
我的问题是:处理这个十六进制字段的最佳方法是什么?我如何才能正确更新textProperty?(我也愿意使用现有组件,但由于我没有找到它,我想我可以尝试自己构建它).您可以使用TextFormatter删除拖尾空白。基本上,您可以检查更改是否为删除,如果生成的文本以空白结尾,您也可以调整删除的开始以删除该空白
UnaryOperator<TextFormatter.Change> filter = new UnaryOperator<TextFormatter.Change>() {
@Override
public TextFormatter.Change apply(TextFormatter.Change c) {
if (c.isDeleted()) {
if (c.getControlNewText()
.endsWith(" ")) {
c.setRange(c.getRangeStart() - 1, c.getRangeEnd());
}
}
if (c.isAdded()) {
}
if (c.isReplaced()) {
}
return c;
}
};
yourTextField.setTextFormatter(new TextFormatter<>(filter));
UnaryOperator过滤器=新的UnaryOperator(){
@凌驾
公共TextFormatter.Change应用(TextFormatter.Change c){
如果(c.isDeleted()){
if(c.getControlNewText()
.endsWith(“”){
c、 setRange(c.getRangeStart()-1,c.getRangeEnd());
}
}
if(c.isAdded()){
}
如果(c.isReplaced()){
}
返回c;
}
};
setTextFormatter(新的TextFormatter(过滤器));
我无法阅读所有内容,但您是否尝试在您的情况下使用方法equalsIgnoreCase()
?
UnaryOperator<TextFormatter.Change> filter = new UnaryOperator<TextFormatter.Change>() {
@Override
public TextFormatter.Change apply(TextFormatter.Change c) {
if (c.isDeleted()) {
if (c.getControlNewText()
.endsWith(" ")) {
c.setRange(c.getRangeStart() - 1, c.getRangeEnd());
}
}
if (c.isAdded()) {
}
if (c.isReplaced()) {
}
return c;
}
};
yourTextField.setTextFormatter(new TextFormatter<>(filter));