Java 释放键时在jLabel上反映jSpinner的值
当我使用键盘更改值时,我的jSpinner不会将值反映到JLabel 当我使用上下箭头时效果很好 当我使用键盘时,JLabel保留以前的值 下面是代码Java 释放键时在jLabel上反映jSpinner的值,java,swing,keylistener,jspinner,Java,Swing,Keylistener,Jspinner,当我使用键盘更改值时,我的jSpinner不会将值反映到JLabel 当我使用上下箭头时效果很好 当我使用键盘时,JLabel保留以前的值 下面是代码 private void jSpinner1StateChanged(javax.swing.event.ChangeEvent evt) { value = (Integer)jSpinner1.getValue(); jLabel1.setTe
private void jSpinner1StateChanged(javax.swing.event.ChangeEvent evt) {
value = (Integer)jSpinner1.getValue();
jLabel1.setText(value.toString());
}
private void jSpinner1KeyTyped(java.awt.event.KeyEvent evt) {
value = (Integer)jSpinner1.getValue();
jLabel1.setText(value.toString());
}
当我更改
使用键盘输入值
- 不要将KeyListener用于Swing JComponents,KeyListener不会正确响应退格,也不会正确响应剪贴板中插入的字符数组(复制->粘贴)
- 使用从JSpinner添加到派生编辑器JTextField/JFormattedTextField的DocumentListener
键盘监听器,它们只是可怕的小生物
其次,JSpinner
本身不是编辑器,而是其他组件的容器,因此,您需要向JSpinner
请求编辑器,例如,从
现在,DefaultEditor
仍然是一个复合类,您需要请求编辑器实际使用的JTextField
JFormattedTextField field = ((DefaultEditor)editor).getTextField();
从这里,您只需在字段中附加一个值。用户需要按Enter键,以使模型/侦听器注意到新值等。。要么那样,要么那样↑ 或↓ 钥匙。如果该值超出允许范围或无效,则不会执行任何操作。有关用于确认默认金属板中的来源,请参见下文
忘记键侦听器
,它在这里是一条死胡同
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
class TimeBeforeClass {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JPanel gui = new JPanel(new FlowLayout(FlowLayout.LEFT, 3,3));
gui.add(new JLabel("Show"));
final JLabel output = new JLabel("Output..");
final JSpinner sp = new JSpinner(
new SpinnerNumberModel(15,0,20,1));
sp.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
output.setText(sp.getValue() + " minutes.");
}
});
gui.add(sp);
gui.add(new JLabel("minutes before class"));
JPanel mainUI = new JPanel(new BorderLayout(5, 5));
mainUI.add(output, BorderLayout.PAGE_END);
mainUI.add(gui);
JOptionPane.showMessageDialog(null, mainUI);
}
});
}
}
我是这样做的,我在设计视图中右键单击jSpinner并自定义代码添加下面的代码现在它工作正常了,jSpinner1只允许数字,所以没有任何其他字符
jSpinner1 = new javax.swing.JSpinner();
jSpinner1.setFont(new java.awt.Font("Calibri", 0, 14));
jSpinner1.setModel(new javax.swing.SpinnerNumberModel(1, 1, 1000, 1));
JFormattedTextField field1 = ((JSpinner.NumberEditor)
jSpinner1.getEditor()).getTextField();
((NumberFormatter) field1.getFormatter()).setAllowsInvalid(false);
DefaultFormatter formatter1 = (DefaultFormatter) field1.getFormatter();
formatter1.setCommitsOnValidEdit(true);
这就是状态改变事件
private void jSpinner1StateChanged(javax.swing.event.ChangeEvent evt)
{
value = (Integer)jSpinner1.getValue();
jLabel1.setText(value.toString());
}
我并不奇怪,JSpinner
本身不是一个编辑器,它是其他几个类的容器?为什么他们右键点击jspinner并添加诸如keyreleased keytyped等事件。。。在Netbeans?内存中,需要点击Enter
,将新值写入模型。忘记键侦听器
,它在这里是一条死胡同。为了更快地获得更好的帮助,请发布一个(最简单的完整且可验证的示例)。如何将文档侦听器添加到jlabel,netbeansJLabel上是否有自动添加选项不可聚焦,默认情况下从不接收KeyEvent,使用纯jlabel此想法是不可能的,不指定用于用户输入,你必须使用JTextField/jformattedtextfield我只是想了解你在说什么请简化你的答案,我使用的是jlabel而不是textfields!您试图在JSpinner
中进行更改,这些更改在发生时由JLabel
反映。为了做到这一点,您需要监视微调器中编辑器的更改…好的,我解决了这个问题,因此微调器具有编辑器组件,该组件与这些箭头分开。谢谢,我将发布答案@用户3498019正如您所知,这不是最好的方法。在用户提交该值之前,他们可以键入任何他们喜欢的内容。如何修复该问题,我的意思是键入任何您喜欢的内容
private void jSpinner1StateChanged(javax.swing.event.ChangeEvent evt)
{
value = (Integer)jSpinner1.getValue();
jLabel1.setText(value.toString());
}