看起来微调控件不会更新手动输入的值,直到用户显式按下enter键。因此,他们可以键入一个值(而不是按enter键),退出控件并提交表单,微调器中显示的值不是微调器的值,而是旧值。
我的想法是在lost focus事件中添加一个侦听器,但是我看不到访问输入的值的方法?
spinner.focusedProperty().addListener((observable, oldValue, newValue) ->
{
//if focus lost
if(!newValue)
{
//somehow get the text the user typed in?
}
});
这是一个奇怪的行为,它似乎违反了GUI微调控件的约定。
发布于 2016-09-08 06:51:31
@kleopatra朝着正确的方向前进,但复制-粘贴解决方案感觉很笨拙,基于TextFormatter的解决方案对我来说根本不起作用。下面是一个较短的函数,它强制Spinner根据需要调用它的私有commitEditorText():
spinner.focusedProperty().addListener((observable, oldValue, newValue) -> {
if (!newValue) {
spinner.increment(0); // won't change value, but will commit editor
}
});
发布于 2017-03-29 20:33:22
以下是Sergio解决方案的改进变体。
initialize方法将Sergio的代码附加到控制器中的所有微调器。
public void initialize(URL location, ResourceBundle resources) {
for (Field field : getClass().getDeclaredFields()) {
try {
Object obj = field.get(this);
if (obj != null && obj instanceof Spinner)
((Spinner) obj).focusedProperty().addListener((observable, oldValue, newValue) -> {
if (!newValue) {
((Spinner) obj).increment(0);
}
});
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
发布于 2015-09-02 05:22:53
使用侦听器应该是可行的。您可以通过微调器的编辑器访问键入的值:
spinner.getEditor().getText();
https://stackoverflow.com/questions/32340476
复制相似问题