【发布时间】:2021-08-23 04:26:33
【问题描述】:
我必须实现一种基于用户键盘输入更新 jbutton 文本的方法, 假设我有这个 gui
当用户单击其中一个按钮时,他必须能够通过在键盘上键入来更改其上的数字,交互必须是直接的,因此无需文本字段或在控制台中键入。
我想使用 Reader 类,但实际上我不明白该怎么做......
在线搜索我发现只有通过控制台/JTextField 来做这件事的方法不是我需要的。我认为这将是一个伪实现:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Gui extends JFrame implements ActionListener {
JButton btn;
public static void main( String[] args ) {
new Gui();
}
public Gui() {
this.getContentPane().setLayout(new FlowLayout());;
this.setTitle("Title");
JButton btn = new JButton("3");
this.getContentPane().add(btn);
btn.addActionListener(this);
btn.setActionCommand("listenForInput");
btn.setSize(30, 30);s
this.pack();
this.setSize(100, 100);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if( cmd.equals("listenForInput")) {
/* ClassThatExtendsReader reader = new ClassThatExtendsReader();
String oldText = btn.getText();
boolean notPressedEnter = ture;
String newNum = "";
while( notPressedEnter ) {
String char = reader.nextLine();
if( char == Enter ) notPressedEnter = false;
newNum = newNum + char;
btn.setText(newNum);
}
if( newNum is not integer ) {
showMessage("wrong input");
btn.setText(oldText);
}
*/
}
}
}
所以:
- 用里面的按钮初始化 JFrame
- 为按钮添加监听器以检测何时被点击
- 点击时读取按下的字符
- 每次输入字符时都会更新按钮文本
- 当按下 ENTER 时停止循环
-
- 我认为侦听器内部的循环应该在
Runnable类中,以便将其放入Thread
- 我认为侦听器内部的循环应该在
【问题讨论】:
-
这能回答你的问题吗? How to detect a key press in Java
-
不需要任何类型的循环或线程。您可以通过两次按下按钮来更改程序的状态。第一次按下激活 KeyListener 并确保被监听的组件具有焦点,第二次按下de-activates KeyListener。或者通过专门侦听 enter 键来停用 KeyListener(如果在 JTextField 中侦听,则使用 ActionListener)。