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

如何通过ATMKeypadPanel按钮向ATMScreenPanel的JTextField输入数字

实现ATM键盘向屏幕输入框输入数字的方案

问题分析

你当前代码的核心问题是:

  • ATMScreenPanel创建了ATMKeypadPanel但未将其添加到界面,导致键盘无法显示
  • 键盘组件无法获取到屏幕输入框的有效引用,无法进行文本更新
  • 使用static修饰输入框不是合理的设计,会破坏封装性

具体实现步骤

1. 重构ATMScreenPanel,封装输入操作并传递自身引用给键盘

去掉static修饰的输入框,添加一个用于接收数字的方法,同时将键盘添加到界面中:

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;

public class ATMScreenPanel extends JPanel {
    private ArrayList<String> pins = new ArrayList<>();
    private JLabel label;
    private JTextField pin_textField; // 去掉static,改为实例变量

    ATMScreenPanel() {
        setBackground(Color.GRAY);
        setLayout(null); // 建议后续改用布局管理器,这里先保持原有写法

        // 初始化输入框
        pin_textField = new JTextField("");
        pin_textField.setHorizontalAlignment(JTextField.CENTER);
        pin_textField.setBounds(98, 110, 300, 50);
        add(pin_textField);

        // 初始化标签
        label = new JLabel("Enter your pin number");
        label.setFont(new Font("Serif", Font.PLAIN, 35));
        label.setBounds(90, 50, 400, 50);
        add(label);

        // 创建键盘并传递当前屏幕面板的引用,同时添加到界面
        ATMKeypadPanel keys = new ATMKeypadPanel(this);
        keys.setBounds(98, 180, 350, 250); // 设置键盘位置
        add(keys);
    }

    // 提供公共方法,供键盘调用添加数字
    public void appendPinNumber(String number) {
        String currentText = pin_textField.getText();
        pin_textField.setText(currentText + number);
        pins.add(number); // 可选:同时维护pins列表
    }
}

2. 修改ATMKeypadPanel,接收屏幕引用并实现按钮点击逻辑

在构造方法中接收ATMScreenPanel实例,在按钮点击时调用屏幕的appendPinNumber方法:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ATMKeypadPanel extends JPanel {
    private JButton[] buttons;
    private ATMScreenPanel screenPanel; // 持有屏幕面板的引用

    // 修改构造方法,接收屏幕面板实例
    ATMKeypadPanel(ATMScreenPanel screenPanel) {
        this.screenPanel = screenPanel;
        buttons = new JButton[14];
        setBackground(Color.CYAN);
        GridBagConstraints gbc = new GridBagConstraints();
        setLayout(new GridBagLayout());
        gbc.insets = new Insets(1, 2, 1, 2);

        Handler buttonHandler = new Handler();
        // 按钮初始化逻辑保持不变,仅修改事件处理部分
        buttons[0] = new JButton("1");
        buttons[0].setPreferredSize(new Dimension(110, 60));
        gbc.gridx = 0;
        gbc.gridy = 0;
        buttons[0].addActionListener(buttonHandler);
        add(buttons[0], gbc);

        buttons[1] = new JButton("2");
        buttons[1].setPreferredSize(new Dimension(110, 60));
        gbc.gridx = 1;
        gbc.gridy = 0;
        buttons[1].addActionListener(buttonHandler);
        add(buttons[1], gbc);

        buttons[2] = new JButton("3");
        buttons[2].setPreferredSize(new Dimension(110, 60));
        gbc.gridx = 2;
        gbc.gridy = 0;
        buttons[2].addActionListener(buttonHandler);
        add(buttons[2], gbc);

        buttons[3] = new JButton("4");
        buttons[3].setPreferredSize(new Dimension(110, 60));
        gbc.gridx = 0;
        gbc.gridy = 1;
        buttons[3].addActionListener(buttonHandler);
        add(buttons[3], gbc);

        buttons[4] = new JButton("5");
        buttons[4].setPreferredSize(new Dimension(110, 60));
        gbc.gridx = 1;
        gbc.gridy = 1;
        buttons[4].addActionListener(buttonHandler);
        add(buttons[4], gbc);

        buttons[5] = new JButton("6");
        buttons[5].setPreferredSize(new Dimension(110, 60));
        gbc.gridx = 2;
        gbc.gridy = 1;
        buttons[5].addActionListener(buttonHandler);
        add(buttons[5], gbc);

        buttons[6] = new JButton("7");
        buttons[6].setPreferredSize(new Dimension(110, 60));
        gbc.gridx = 0;
        gbc.gridy = 2;
        buttons[6].addActionListener(buttonHandler);
        add(buttons[6], gbc);

        buttons[7] = new JButton("8");
        buttons[7].setPreferredSize(new Dimension(110, 60));
        gbc.gridx = 1;
        gbc.gridy = 2;
        buttons[7].addActionListener(buttonHandler);
        add(buttons[7], gbc);

        buttons[8] = new JButton("9");
        buttons[8].setPreferredSize(new Dimension(110, 60));
        gbc.gridx = 2;
        gbc.gridy = 2;
        buttons[8].addActionListener(buttonHandler);
        add(buttons[8], gbc);

        buttons[9] = new JButton("0");
        buttons[9].setPreferredSize(new Dimension(110, 60));
        gbc.gridx = 1;
        gbc.gridy = 3;
        buttons[9].addActionListener(buttonHandler);
        add(buttons[9], gbc);
    }

    private class Handler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            // 通过getSource获取点击的按钮,直接取文本内容
            JButton clickedButton = (JButton) e.getSource();
            String number = clickedButton.getText();
            // 调用屏幕面板的方法添加数字
            screenPanel.appendPinNumber(number);
        }
    }
}

关键改进点

  • 去掉了static输入框,通过依赖注入的方式将屏幕面板引用传递给键盘,符合面向对象封装原则
  • 简化了按钮点击事件的处理逻辑,无需逐个判断按钮,直接获取按钮文本即可
  • 修复了键盘未添加到界面的问题,确保键盘可以显示并交互

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:21:06