获取ENTER用JSpinner的工作将其与一个JTextField的方式做
-
22-08-2019 - |
题
首先,让我的工作,解释更容易一点,这里是我的一些代码:
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);
}
用这种方法唯一的问题是,随后必须捕捉任何NumberFormatException
s,解析值,其中SwingUtilities.invokeLater()
方法允许微调模型来自动删除任何无效字符,并继续进行该查询。当
不管怎样,我还是与Java有点缺乏经验,所以如果我的这种理解是不正确,请让我知道了意见。