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

