Java 按键在JLabel中逐个更改值
我试图在按下一个键时更改jLabel值,但我的疑问是:我可以逐个更改值增量吗? 比如,我想显示9个数字,但是,在按下一个键之后,一个接一个地显示。按照我的方式,由于“break;”命令,它以“1”停止,然后返回到开始时再次显示“1”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
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
是基于它注册到的组件的焦点可用性,添加任何需要键盘焦点的组件(按钮、文本字段等)都将停止键盘侦听器的工作