Java Swing如何关联两个ActionListener实现字母回填按钮功能
填字游戏功能实现方案
实现核心思路
- 记录触发点击的填字格子:在
Keyboard的actionPerformed方法中通过e.getSource()获取被点击的JButton实例,作为当前要填充的目标格子 - 构建模态字母选择弹窗:用
JDialog实现键盘GUI,设置为模态阻塞主界面操作,避免用户同时选中多个格子 - 绑定字母按钮逻辑:每个字母按钮点击后,直接将字母文本设置到之前记录的目标格子上,关闭弹窗即可完成赋值
完整修改代码
调整后的Keyboard类
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import java.awt.GridLayout; public class Keyboard implements ActionListener{ // 存储当前被点击的填字格子按钮 private JButton targetCell; // 字母键盘弹窗实例,避免重复创建 private JDialog keyboardDialog; @Override public void actionPerformed(ActionEvent e) { // 获取触发点击的填字格子,存为目标赋值对象 targetCell = (JButton) e.getSource(); // 首次调用时初始化键盘弹窗 if(keyboardDialog == null){ initKeyboardDialog(); } // 居中显示弹窗 keyboardDialog.setLocationRelativeTo(null); keyboardDialog.setVisible(true); } // 初始化26字母键盘弹窗 private void initKeyboardDialog(){ keyboardDialog = new JDialog(); keyboardDialog.setTitle("选择字母"); keyboardDialog.setModal(true); keyboardDialog.setLayout(new GridLayout(3,9,5,5)); keyboardDialog.setSize(400,200); // 生成26个字母按钮 for(char c = 'A'; c <= 'Z'; c++){ JButton letterBtn = new JButton(String.valueOf(c)); // 绑定字母按钮点击逻辑 letterBtn.addActionListener(letterEvent -> { // 把选中的字母写入目标填字格子 targetCell.setText(letterBtn.getText()); // 关闭键盘弹窗 keyboardDialog.setVisible(false); }); keyboardDialog.add(letterBtn); } } }
优化后的Puzzle类(可选,仅修正原有编码规范问题)
原有代码可直接运行,调整后更符合Swing开发规范:
import java.awt.event.ActionListener; import javax.swing.*; public class Puzzle extends JPanel { public Puzzle(ActionListener listener) { JButton a =new JButton(); JButton b = new JButton(); a.setBounds(50,100,95,30); b.setBounds(50,300,95,30); add(a); add(b); a.addActionListener(listener); b.addActionListener(listener); } public static void main(String[] args) { JFrame f =new JFrame("填字游戏"); Puzzle puzzle = new Puzzle(new Keyboard()); f.add(puzzle); f.setSize(400,400); f.setLayout(null); // 关闭窗口时同步退出程序 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }
内容的提问来源于stack exchange,提问作者Kong
相关产品推荐
相关产品推荐

