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

如何防止JColorChooser选中颜色后吸收JComponent的KeyEvents事件

问题根源

你遇到的问题本质是Swing的键盘事件是焦点敏感的:

  • 只有当前持有焦点的组件才能触发KeyListener事件
  • 你操作JColorChooser选择颜色时,焦点会被JColorChooser内部的组件抢走,此时不管是你的自定义PhotoComponent还是外层JFrame都不再持有焦点,自然无法触发键盘事件
  • 你之前给JFrame加键盘事件转发的方案本身就不可靠,只要有其他子组件拿到焦点,JFrame的KeyListener就不会触发
解决方案

按以下步骤修改代码即可解决:

1. 点击自定义组件时主动请求焦点

你虽然给PhotoComponent设置了setFocusable(true),但默认点击组件不会自动获取焦点,需要在点击逻辑里主动申请。修改PhotoComponent的mouseClicked方法:

@Override
public void mouseClicked(MouseEvent e) {
    super.mouseClicked(e);
    currentText = new Text(e.getPoint());
    textList.add(currentText);
    // 新增这行,点击组件时主动获取焦点
    requestFocusInWindow();
}

改完之后只要你点击一次PhotoComponent区域,它就会拿到焦点,自身绑定的KeyListener就能正常触发,不需要额外给JFrame做事件转发,可以删掉主类里给frame添加KeyListener的那段代码。

2. (可选)选择颜色后自动切回焦点

如果希望选完颜色不需要手动点击PhotoComponent就能直接继续输入,可以在JColorChooser的ChangeListener里加一行焦点切换逻辑,修改主类里的ChangeListener代码:

colorChooser.getSelectionModel().addChangeListener(new ChangeListener() {
    @Override
    public void stateChanged(ChangeEvent e) {
        Color color = colorChooser.getColor();
        if (color != null)
            pc.setColor(color);
        // 新增这行,设置完颜色后把焦点切回自定义组件
        pc.requestFocusInWindow();
    }
});

修改完成后运行测试即可:点击PhotoComponent区域选中输入位置,直接输入字符就能显示,选择颜色后不需要额外操作就能继续输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:36:01