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

如何在主类JFrame中添加KeyListener类按键触发的JLabel图片

解决方案

核心逻辑是给自定义监听器传入主窗口实例,让监听器可以操作主窗口添加组件,修改后的代码如下:

修改后的MKeyListener类代码

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;
import java.awt.*;

class MKeyListener extends KeyAdapter {
    static int n = 0;
    // 存储主窗口实例
    private JFrame mainFrame;
    // 存储图片标签,也可复用同一个实例控制显示/隐藏
    private JLabel imgLabel;

    // 构造方法传入主窗口
    public MKeyListener(JFrame frame) {
        this.mainFrame = frame;
        // 提前初始化图片标签,替换成你自己的图片路径
        ImageIcon icon = new ImageIcon("your_image_path.png");
        imgLabel = new JLabel(icon);
        // 设置标签尺寸适配图片
        imgLabel.setSize(icon.getIconWidth(), icon.getIconHeight());
    }

    @Override
    public void keyPressed(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.VK_ESCAPE) {
            n += 1;
            if(n % 2 == 1) {
                // 奇数次按下ESC添加图片
                mainFrame.add(imgLabel, BorderLayout.NORTH);
                // 添加组件后必须调用这两个方法刷新界面
                mainFrame.revalidate();
                mainFrame.repaint();
            } else {
                // 偶数次按下ESC移除图片
                mainFrame.remove(imgLabel);
                mainFrame.revalidate();
                mainFrame.repaint();
                System.out.println("Not Quitting now");
            }
        } else if(event.getKeyCode() == KeyEvent.VK_ENTER && n % 2 == 1) {
            System.out.println("Quitting now...");
            // 避免在Swing事件线程调用Thread.sleep阻塞界面,改用Timer实现延迟退出
            Timer timer = new Timer(200, e -> System.exit(0));
            timer.setRepeats(false);
            timer.start();
        }
    }
}

修改后的Main类代码

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

public class Main {
    public static void main(String[] args) throws Exception {
        JFrame jframe = new JFrame();
        JTextField textField = new JTextField();
        // 初始化监听器时传入主窗口实例
        textField.addKeyListener(new MKeyListener(jframe));
        
        jframe.add(textField, BorderLayout.CENTER);
        jframe.setSize(1000, 1000);
        jframe.setTitle("First Development In JAVA Try : Day 3");
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setVisible(true);
    }
}

注意事项

  • 将代码中的your_image_path.png替换为你本地图片的实际路径,相对路径默认指向项目根目录
  • 当前实现仅在JTextField处于聚焦状态时响应按键,如果需要全局不聚焦也能响应按键,可改用Swing键绑定(Key Binding)方案
  • 如果需要实现不同按键对应不同图片,可在监听器中维护按键code和图片标签的映射关系,触发时添加对应标签即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:15:06