首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JavaFX微调器中手动键入文本不会更新值(除非用户按ENTER键)

在JavaFX微调器中手动键入文本不会更新值(除非用户按ENTER键)
EN

Stack Overflow用户
提问于 2015-09-02 04:38:27
回答 5查看 13.1K关注 0票数 29

看起来微调控件不会更新手动输入的值,直到用户显式按下enter键。因此,他们可以键入一个值(而不是按enter键),退出控件并提交表单,微调器中显示的值不是微调器的值,而是旧值。

我的想法是在lost focus事件中添加一个侦听器,但是我看不到访问输入的值的方法?

代码语言:javascript
复制
spinner.focusedProperty().addListener((observable, oldValue, newValue) -> 
{
    //if focus lost
    if(!newValue)
    {
        //somehow get the text the user typed in?
    }
});

这是一个奇怪的行为,它似乎违反了GUI微调控件的约定。

EN

回答 5

Stack Overflow用户

发布于 2016-09-08 06:51:31

@kleopatra朝着正确的方向前进,但复制-粘贴解决方案感觉很笨拙,基于TextFormatter的解决方案对我来说根本不起作用。下面是一个较短的函数,它强制Spinner根据需要调用它的私有commitEditorText():

代码语言:javascript
复制
spinner.focusedProperty().addListener((observable, oldValue, newValue) -> {
  if (!newValue) {
    spinner.increment(0); // won't change value, but will commit editor
  }
});
票数 29
EN

Stack Overflow用户

发布于 2017-03-29 20:33:22

以下是Sergio解决方案的改进变体。

initialize方法将Sergio的代码附加到控制器中的所有微调器。

代码语言:javascript
复制
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();
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2015-09-02 05:22:53

使用侦听器应该是可行的。您可以通过微调器的编辑器访问键入的值:

代码语言:javascript
复制
spinner.getEditor().getText();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32340476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档