首先,让我的工作,解释更容易一点,这里是我的一些代码:

JSpinner spin = new JSpinner();
JFormattedTextField text = getTextField(spin);

text.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
            // Do stuff...
    }
});

...

private JFormattedTextField getTextField(JSpinner spinner) {
    JComponent editor = spinner.getEditor();

    if (editor instanceof JSpinner.DefaultEditor) {
        return ((JSpinner.DefaultEditor )editor).getTextField();
    } else {
        System.err.println( "Unexpected editor type: "
                           + spinner.getEditor().getClass()
                           + " isn't a descendant of DefaultEditor" );
        return null;
    }
}

因此,大家可以看到,我得到了那么远。的确,当我在一个值到纺丝器(JFormattedTextField)的文本字段组件类型,然后按ENTER键,它的工作原理。

我现在要的是能够有文本字段响应,而不必手动输入一个新的值(其几分失败使得旋出它的目的)进入。我该怎么做呢?

有帮助吗?

解决方案

我知道这是不是动作监听......但也许这会为你工作?


    text.addKeyListener( new KeyAdapter() {
            @Override
            public void keyReleased( final KeyEvent e ) {
                if ( e.getKeyCode() == KeyEvent.VK_ENTER ) {
                    System.out.println( "enter pressed" );
                }
            }
        } );

其他提示

我只是碰到了关于这一点,我自己的问题。就我而言,我有一个的JSpinner用SpinnerNumberModel设置,以便我可以输入数字的ID值,然后从远程数据库中获取它们。这个工作都很好用一个JButton作为我的触发器的查询,但我希望能够将焦点切换到通过标签领域,并回车,也可以通过输入与数字键的ID更改数值,然后按下回车键。

这是给我的大多数问题的一个手动用数字键输入ID,然后按回车。当我这样做,查询仍然会发生,但它是查询以前的ID,而不是我刚才输入的,所以我不得不打再次输入查询新的ID(见代码)

((JSpinner.DefaultEditor) minRng.getEditor()).getTextField().addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            queryData();
        }
    }
});

和查询方法:

private void queryData() {
    int minVal = Integer.parseInt(minRng.getValue().toString());
    queryDataBase(minVal);
}

为了解决这个问题,我所要做的就是强制查询等待运行,直到微调更新了它的价值,这是很容易使用SwingUtilities.invokeLater()迫使它向EDT队列的末尾,像这样做:

((JSpinner.DefaultEditor) minRng.getEditor()).getTextField().addKeyListener(new KeyAdapter() {
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    queryData();
                }
            });
        }
    }
});

由于该invokeLater()查询现在发生在新的价值,而不是以前的一个,当按下回车,为的JSpinner有其价值,然后更新到新输入的一个。

我假设这种情况的原因是,输入的数值没有正式应用于JSpinner直到你按下回车键,这也激发了关键监听查询。自定义的KeyEvent [查询]键听者似乎是在队列中的第一个,所以它首先运行其代码,然后从内部KeyEvent,其是将所述值与JSpinner为什么它查询旧的JFormattedTextField值。 SwingUtilities.invokeLater()正好将查询本身在队列的末尾,所以它允许其它KeyEvent运行查询之前完成其代码。

修改

要实现这一点的另一种方式是直接从JFormattedTextField要求值,而不是JSpinner,因为这也应该因为JFormattedTextField包含您键入的值返回新输入的值,但尚未传递到的JSpinner的,这似乎是在问题所在。

private void queryData() {
    JFormattedTextField tf = ((JSpinner.DefaultEditor) minRng.getEditor()).getTextField();
    int minVal = Integer.parseInt(tf.getText());
    queryDataBase(minVal);
}

用这种方法唯一的问题是,随后必须捕捉任何NumberFormatExceptions,解析值,其中SwingUtilities.invokeLater()方法允许微调模型来自动删除任何无效字符,并继续进行该查询。当

不管怎样,我还是与Java有点缺乏经验,所以如果我的这种理解是不正确,请让我知道了意见。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top