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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:15:03