Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 释放键时在jLabel上反映jSpinner的值_Java_Swing_Keylistener_Jspinner - Fatal编程技术网

Java 释放键时在jLabel上反映jSpinner的值

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

当我使用键盘更改值时,我的jSpinner不会将值反映到JLabel

当我使用上下箭头时效果很好

当我使用键盘时,JLabel保留以前的值

下面是代码

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());
    }