我有这个字段,我在其中插入端口号。我想将字符串自动转换为数字:
fieldNport = new TextField();
fieldNport.setPrefSize(180, 24);
fieldNport.setFont(Font.font("Tahoma", 11));
grid.add(fieldNport, 1, 1);
你能告诉我怎么做吗?我在堆栈溢出中找不到合适的例子。
编辑:
也许这个:
fieldNport.textProperty().addListener(new ChangeListener()
{
@Override
public void changed(ObservableValue o, Object oldVal, Object newVal)
{
try
{
int Nport = Integer.parseInt((String) oldVal);
}
catch (NumberFormatException e)
{
}
}
});
答案 0 :(得分:5)
从JavaFX 8u40开始,您可以在文本字段中设置TextFormatter对象:
UnaryOperator<Change> filter = change -> {
String text = change.getText();
if (text.matches("[0-9]*")) {
return change;
}
return null;
};
TextFormatter<String> textFormatter = new TextFormatter<>(filter);
fieldNport = new TextField();
fieldNport.setTextFormatter(textFormatter);
这可以避免在将更改侦听器添加到text属性并修改该侦听器中的文本时获得的子类化和重复更改事件。
答案 1 :(得分:2)
你可以这样写:
fieldNPort.text.addListener(new ChangeListener(){
@Override public void changed(ObservableValue o,Object oldVal, Object newVal){
//Some Code
//Here you can use Integer.parseInt methods inside a try/catch
//because parseInt throws Exceptions
}
});
以下是JavaFX中有关属性和监听器的所有内容:
http://docs.oracle.com/javafx/2/binding/jfxpub-binding.htm
如果您有任何疑问,我将很乐意为您提供帮助。
答案 2 :(得分:2)
也许这就是你所需要的:
fieldNPort= new TextField()
{
@Override
public void replaceText(int start, int end, String text)
{
if (text.matches("[0-9]*"))
{
super.replaceText(start, end, text);
}
}
@Override
public void replaceSelection(String text)
{
if (text.matches("[0-9]*"))
{
super.replaceSelection(text);
}
}
};
这将限制用户输入除数字之外的任何内容(您可以根据需要修改正则表达式),然后您不必担心Integer.parseInt
抛出任何异常。