Java Swing如何实现点击JButton将值传入选中的JTextField
多输入框场景下数字按钮填值实现方案
核心解决思路
单输入框场景下你写死了赋值目标,所以能正常运行;多输入框场景只需要额外维护一个类成员变量,记录用户最后选中的是哪个JTextField,点击数字按钮时直接把值写入这个记录的输入框即可。
具体修改点
- 新增成员变量存储当前激活的输入框
在原有组件声明位置加一行变量定义:private JTextField currentSelectedField; - 替换原输入框绑定的ActionListener,改用焦点监听器
JTextField的ActionListener仅在用户输入完成按回车键时触发,无法捕捉「点击选中输入框」的操作。使用FocusListener可以在输入框被点中、获得焦点时,自动把currentSelectedField更新为当前选中的输入框。 - 重写事件处理逻辑,区分不同组件的触发行为:
- 点击数字按钮时,如果
currentSelectedField不为空(用户已经选中过输入框),就把按钮对应数字填入该输入框 - 补全清空、退出按钮的逻辑:点击清空按钮把所有输入框置空,点击退出按钮直接关闭程序
- 点击数字按钮时,如果
- 可选优化:窗口初始化时默认给第一个输入框焦点,避免用户首次未选输入框时点击数字无响应。
修改后完整可运行代码
package jamilzin.magicsquare; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MagicSquare implements ActionListener { // 组件声明 JFrame frame; JPanel panel, panelFunctions; JButton[] numbers = new JButton[10]; JTextField[] positions = new JTextField[9]; JButton[] functions = new JButton[2]; // 记录当前选中的输入框 private JTextField currentSelectedField; void magicSquare() { frame = new JFrame("Quadrado Magico"); frame.setSize(500, 500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel = new JPanel(); panelFunctions = new JPanel(); // 初始化1-9数字按钮 for (int i = 1; i < 10; i++) { numbers[i] = new JButton(String.valueOf(i)); numbers[i].addActionListener(this); numbers[i].setBackground(Color.lightGray); } // 初始化功能按钮 functions[0] = new JButton("Limpar"); functions[1] = new JButton("Sair"); functions[0].addActionListener(this); functions[1].addActionListener(this); // 初始化9个输入框,绑定焦点监听器 for (int i = 0; i < 9; i++) { positions[i] = new JTextField(); int finalI = i; positions[i].addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { currentSelectedField = positions[finalI]; } }); } // 布局配置 panel.setBounds(0, 0, 500, 400); panel.setLayout(new GridLayout(6, 3, 0, 0)); panelFunctions.setBounds(50, 410, 400, 30); panelFunctions.setLayout(new GridLayout(1, 2, 250, 0)); // 面板添加组件 for (int i = 0; i < 9; i++) { panel.add(positions[i]); } for (int i = 1; i < 10; i++) { panel.add(numbers[i]); } panelFunctions.add(functions[0]); panelFunctions.add(functions[1]); frame.setLayout(null); frame.add(panel); frame.add(panelFunctions); // 默认选中第一个输入框 positions[0].requestFocusInWindow(); currentSelectedField = positions[0]; frame.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { Object source = e.getSource(); // 处理数字按钮点击逻辑 for (int i = 1; i < 10; i++) { if (source == numbers[i]) { if (currentSelectedField != null) { currentSelectedField.setText(String.valueOf(i)); } return; } } // 处理清空按钮逻辑 if (source == functions[0]) { for (JTextField field : positions) { field.setText(""); } positions[0].requestFocusInWindow(); return; } // 处理退出按钮逻辑 if (source == functions[1]) { frame.dispose(); } } public static void main(String[] args) { MagicSquare quadrado = new MagicSquare(); quadrado.magicSquare(); } }
运行效果
代码运行后交互完全匹配需求:
- 点击任意输入框即可选中,输入框出现光标
- 点击下方1-9数字按钮,对应数值会自动填入上一步选中的输入框
- 点击Limpar按钮清空所有输入内容,点击Sair按钮直接关闭窗口
内容的提问来源于stack exchange,提问作者ffffffff
相关产品推荐
相关产品推荐

