You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Swing如何实现点击JButton将值传入选中的JTextField

多输入框场景下数字按钮填值实现方案

核心解决思路

单输入框场景下你写死了赋值目标,所以能正常运行;多输入框场景只需要额外维护一个类成员变量,记录用户最后选中的是哪个JTextField,点击数字按钮时直接把值写入这个记录的输入框即可。


具体修改点

  1. 新增成员变量存储当前激活的输入框
    在原有组件声明位置加一行变量定义:
    private JTextField currentSelectedField;
    
  2. 替换原输入框绑定的ActionListener,改用焦点监听器
    JTextField的ActionListener仅在用户输入完成按回车键时触发,无法捕捉「点击选中输入框」的操作。使用FocusListener可以在输入框被点中、获得焦点时,自动把currentSelectedField更新为当前选中的输入框。
  3. 重写事件处理逻辑,区分不同组件的触发行为:
    • 点击数字按钮时,如果currentSelectedField不为空(用户已经选中过输入框),就把按钮对应数字填入该输入框
    • 补全清空、退出按钮的逻辑:点击清空按钮把所有输入框置空,点击退出按钮直接关闭程序
  4. 可选优化:窗口初始化时默认给第一个输入框焦点,避免用户首次未选输入框时点击数字无响应。

修改后完整可运行代码

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. 点击任意输入框即可选中,输入框出现光标
  2. 点击下方1-9数字按钮,对应数值会自动填入上一步选中的输入框
  3. 点击Limpar按钮清空所有输入内容,点击Sair按钮直接关闭窗口

内容的提问来源于stack exchange,提问作者ffffffff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:48:46