Java 按键在JLabel中逐个更改值

Java 按键在JLabel中逐个更改值,java,swing,keylistener,keyevent,Java,Swing,Keylistener,Keyevent,我试图在按下一个键时更改jLabel值,但我的疑问是:我可以逐个更改值增量吗? 比如,我想显示9个数字,但是,在按下一个键之后,一个接一个地显示。按照我的方式,由于“break;”命令,它以“1”停止,然后返回到开始时再次显示“1” import java.awt.*; 导入java.awt.event.*; 导入javax.swing.*; 公共类自动机扩展JFrame实现KeyListener{ 公共静态void main(字符串参数[]){ 新自动机(); } JLabel lbNumer

我试图在按下一个键时更改jLabel值,但我的疑问是:我可以逐个更改值增量吗? 比如,我想显示9个数字,但是,在按下一个键之后,一个接一个地显示。按照我的方式,由于“break;”命令,它以“1”停止,然后返回到开始时再次显示“1”

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类自动机扩展JFrame实现KeyListener{
公共静态void main(字符串参数[]){
新自动机();
}
JLabel lbNumero=新JLabel(“0”);
自动机(){
setDefaultCloseOperation(关闭时退出);
设置大小(300300);
setTitle(“自动机”);
setLocationRelativeTo(空);
setLayout(新的FlowLayout());
setVisible(真);
lbNumero.setFont(新字体(“Arial”,Font.PLAIN,200));
lbNumero.setForeground(颜色:红色);
addKeyListener(此);
添加(lbo);
}
@凌驾
按下公共无效键(按键事件e){
int-teclaPressionada=e.getKeyCode();
对于(int i=0;i<9;){
if(tecapressionada==KeyEvent.VK_NUMPAD1){
i++;
lbNumero.setText(“+i”);
系统输出打印LN(i);
}
break;//无中断的无限输出
}
}
@凌驾
公共无效密钥已释放(密钥事件e){
}
@凌驾
public void keyTyped(KeyEvent e){
}
}

为什么要使用循环?创建一个
int i
实例变量,并在按键时将其递增1。像这样

public void keyPressed(KeyEvent e) {
    int teclaPressionada = e.getKeyCode();

        if (teclaPressionada == KeyEvent.VK_NUMPAD1&& i<9) {
            i++;
            lbNumero.setText("" + i);
            System.out.println(i);
        }

    }
按下公共无效键(按键事件e){ int-teclaPressionada=e.getKeyCode();
如果(teclaPressionada==KeyEvent.VK_NUMPAD1&&i为什么要使用循环?创建一个
int i
实例变量,并在按键时将其递增1。如下所示

public void keyPressed(KeyEvent e) {
    int teclaPressionada = e.getKeyCode();

        if (teclaPressionada == KeyEvent.VK_NUMPAD1&& i<9) {
            i++;
            lbNumero.setText("" + i);
            System.out.println(i);
        }

    }
按下公共无效键(按键事件e){ int-teclaPressionada=e.getKeyCode();
如果(teclaPressionada==KeyEvent.VK_NUMPAD1&&i我不确定循环的
点是什么,您只需从
i
中添加(或减去)一个,检查以确保它在可接受的范围内,并更新标签

但是,我强烈建议您不要使用
KeyListener
,因为它有很多问题,因此建议您改用key bindings API,例如

import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JLabel label;
        private int value = 0;

        public TestPane() {
            label = new JLabel();
            label.setFont(label.getFont().deriveFont(Font.BOLD, 48f));

            setLayout(new GridBagLayout());
            add(label);

            updateLabel();

            InputMap im = label.getInputMap(WHEN_IN_FOCUSED_WINDOW);
            ActionMap am = label.getActionMap();

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD8, 0), "increment");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, 0), "decrement");

            am.put("increment", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    value = Math.min(9, ++value);
                    updateLabel();
                }
            });
            am.put("decrement", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    value = Math.max(0, --value);
                    updateLabel();
                }
            });
        }

        protected void updateLabel() {
            label.setText(String.format("%02d", value));
        }

    }

}

有关更多详细信息,请参见

我不确定循环
点是什么,您只需从
I
中添加(或减去)一个,检查以确保它在可接受的范围内,并更新标签

但是,我强烈建议您不要使用
KeyListener
,因为它有很多问题,因此建议您改用key bindings API,例如

import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JLabel label;
        private int value = 0;

        public TestPane() {
            label = new JLabel();
            label.setFont(label.getFont().deriveFont(Font.BOLD, 48f));

            setLayout(new GridBagLayout());
            add(label);

            updateLabel();

            InputMap im = label.getInputMap(WHEN_IN_FOCUSED_WINDOW);
            ActionMap am = label.getActionMap();

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD8, 0), "increment");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, 0), "decrement");

            am.put("increment", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    value = Math.min(9, ++value);
                    updateLabel();
                }
            });
            am.put("decrement", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    value = Math.max(0, --value);
                    updateLabel();
                }
            });
        }

        protected void updateLabel() {
            label.setText(String.format("%02d", value));
        }

    }

}

有关更多详细信息,请参见

Wow!非常感谢,我想到了这个主意。另外,在从头开始调用NUMPAD_0时,我添加了一个else。顺便说一句,这是我第一次使用StackOverflow,很抱歉给您添麻烦;)@gamorim没问题。所以现在你的应用程序可以运行了。对吗?是的,谢谢!还有一件事,我将事件移动到keyReleased方法,因为如果按住键,变量将无法正常运行。哇!非常感谢,我想到了这个主意。另外,在从头调用NUMPAD_0时,我添加了一个else。顺便说一句,这是我第一次使用StackOverflow,很抱歉给您添麻烦;)@gamorim没问题。所以现在你的应用程序可以工作了。对吗?是的,谢谢!还有一件事,我把事件移到了keyReleased方法,因为如果按住键,变量就不能正常运行。谢谢你的回答,我不知道那些API。我是JFrame的新手,但我明白了重点,即使是在更改Pro的所有标准时都迟到了ject.@gamorim请注意,
KeyListener
基于它注册到的组件的焦点可用性,添加任何需要键盘焦点的组件(按钮、文本字段等)将阻止您的
KeyListener
向您查询答案,我不知道这些API。我是JFrame的新手,但我明白了重点,甚至在更改项目的所有标准时都迟到了。@gamorim请注意
KeyListener
是基于它注册到的组件的焦点可用性,添加任何需要键盘焦点的组件(按钮、文本字段等)都将停止
键盘侦听器的工作