5

已经尝试了几种不同的方法,但到目前为止没有成功。只是想知道我是否遗漏了什么。我有一个 JSpinner,它是日历旁边的 DateSelector 小部件的一个组件。如果用户更改 JSpinner 中的任何文本而不是使用 Calendar 控件或 JSpinner 上下箭头,我将尝试触发验证方法。

以下是我尝试过的不同方法:

jSpinner1.addKeyListener(kl);

jSpinner1.getEditor().addKeyListener(kl);

((JSpinner.DefaultEditor) jSpinner1.getEditor().getTextField().addKeyListener(kl);

那里的任何人对我做错了什么有任何想法?谢谢

更新 道歉,我应该说我已经向附加到 JSpinner 的 JSpinnerDateModel 添加了一个 ChangeListener。像这样:

ChangeListener changeListener = new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            dateChanged();
        }
    };

    jSpinnerDateModel.addChangeListener(changeListener);

    KeyListener keyListener = new KeyListener() {

        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println(e.getKeyChar());
            dateChanged();
        }

        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub

        }

    };
    ((JSpinner.DefaultEditor) jSpinner1.getEditor()).getTextField().addKeyListener(
            keyListener);

谢谢

坦率

4

3 回答 3

14

如果要禁用键盘编辑,请执行以下操作:

JFormattedTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField();
tf.setEditable(false);

要侦听关键事件,您需要向文本字段添加侦听器。这对我有用:

((JSpinner.DefaultEditor)spinner.getEditor()).getTextField().addKeyListener(new KeyListener(){

            @Override
            public void keyPressed(KeyEvent e) {                    
            }

            @Override
            public void keyReleased(KeyEvent e) {
                System.out.println("PRESSED!");                    
            }

            @Override
            public void keyTyped(KeyEvent e) {                    
            }

        });
于 2010-10-06T15:05:23.643 回答
2

这是 Swing 的不足,我认为 JSpinner 应该遵循 JComboBox 提供对底层文本字段的以下访问:

JComboBox.getEditor().getEditorComponent()

通过查看 J1.7 的源代码,我发现您可以通过以下方式实现几乎相同的目标

JSpinner.getEditor().getComponent(0)

因此,您可以通过以下方式“破解”侦听器:

JSpinner.getEditor().getComponent(0).addKeyListener(...)

显然,这取决于 swing 的“幕后”实现,并在 J1.7 中工作,但不能保证这适用于未来或过去的其他版本。

享受。

编辑

或者如果编辑器是 DefaultEditor 的一个实例,您可以将其转换为这样并使用“getTextField()”。如果在接口中定义它会很方便。

于 2013-04-09T23:12:11.433 回答
2

JSpinners 自己处理 KeyEvents,但他们将 ChangeEvents 发送到外部世界。添加一个 ChangeListener 应该允许您执行您希望的验证。

另请参阅:检测微调器值更改(Java 教程)

于 2010-10-06T15:10:24.280 回答