如何通过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
相关产品推荐
相关产品推荐

