如何根据JPanel背景图片调整JCheckbox文本前景色提升可读性
解决方案
方案1:添加半透明文字衬底(推荐,兼容性最高)
不需要动态计算背景颜色,适配所有背景场景,仅需要重写JCheckBox的绘制方法,改动量极小:
final JCheckBox INFO_IMG = new JCheckBox("Ver img") { @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g.create(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 设置半透明白色作为文字衬底,最后一个参数为透明度,范围0-255,可自行调整 g2d.setColor(new Color(255, 255, 255, 170)); FontMetrics fm = g2d.getFontMetrics(); int textW = fm.stringWidth(getText()); int textH = fm.getHeight(); // 绘制带圆角的衬底区域,坐标可根据实际显示效果微调 g2d.fillRoundRect( getInsets().left + getIcon().getIconWidth() + getIconTextGap() - 2, getHeight()/2 - textH/2 - 1, textW + 4, textH + 2, 3, 3 ); g2d.dispose(); super.paintComponent(g); } };
其余原有代码不需要修改,该方案可以保证文字在任意背景上都有足够对比度,不会出现看不清的情况。
方案2:动态计算反色前景
优化你原本的取色思路,修复语法问题后即可实现反色效果:
- 先在类成员位置实例化
Robot,处理异常:
private Robot ROBOT = new Robot();
- 在图片显示后添加取色反色逻辑:
if (1 == ie.getStateChange()) { INFO_IMG.setText("Ver info"); IMG.setVisible(true); // 等待图片渲染完成后取色 SwingUtilities.invokeLater(() -> { try { Point loc = INFO_IMG.getLocationOnScreen(); Color bgColor = ROBOT.getPixelColor(loc.x + 12, loc.y + 10); // 计算反色 Color invertColor = new Color( 255 - bgColor.getRed(), 255 - bgColor.getGreen(), 255 - bgColor.getBlue() ); INFO_IMG.setForeground(invertColor); } catch (Exception e) { // 防止组件未挂载时调用getLocationOnScreen抛出异常 INFO_IMG.setForeground(Color.BLACK); } }); } else { INFO_IMG.setText("Ver img"); IMG.setVisible(false); // 恢复默认文字颜色 INFO_IMG.setForeground(Color.BLACK); }
该方案可以实现完全的反色效果,需要注意必须等图片渲染完成后再取色,否则会拿到错误的背景色。
内容的提问来源于stack exchange,提问作者Ignacio Inzerilli
相关产品推荐
相关产品推荐

