如何从自定义 JButton 拦截 paintComponent

How to intercept paintComponent from Custom JButton

我创建了一个具有透明背景的自定义 JButton 和一条来自 graphics.drawRoundRect() 的画线,但是当我开始我的程序进行测试时,我的 JCheckbox 一直出现在按钮的顶部。

开头是这样的

这是我将鼠标光标悬停在按钮上之后的结果

这是来自 paintComponent 方法的代码

    @Override
public void paintComponent(Graphics graphics) {
    graphics.setColor(this.getForeground());
    graphics.drawRoundRect(2, 2, this.getWidth() - 4, this.getHeight() - 4, 30, 30);
    graphics.setFont(this.getFont());

    int centerX = getWidth() / 2;
    int centerY = getHeight() / 2;

    FontMetrics fontMetrics = graphics.getFontMetrics();
    Rectangle stringBounds = fontMetrics.getStringBounds(this.getText(), graphics).getBounds();

    int textX = centerX - stringBounds.width / 2;
    int textY = centerY + fontMetrics.getAscent() / 2;

    graphics.setColor(this.getForeground());
    graphics.drawString(this.getText(), textX, textY);

}

我的按钮 class 中没有任何其他方法,除了其中包含 super() 的构造函数。 Class 继承自 JButton class 并且我在测试程序中将前景属性设置为 Color.white 并通过

添加了按钮
frame.getContentPane().add(button);

因为我的声誉不够高,所以我无法将屏幕截图插入我正在使用 imgur 链接的问题中。 如果不允许 post 我问题中的链接,我会立即删除它们

你已经打破了油漆链,你必须打电话给 super.paintComponent

public void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);

本质上,Graphics是一个共享资源,每个绘制的组件都会使用相同的Graphics上下文,这意味着除非你先清除它,否则你可能仍然拥有之前绘制的内容那里。 paintComponent 的工作之一是用组件的背景颜色清除 Graphics 上下文...

有关详细信息,请参阅 Painting in AWT and Swing and Performing Custom Painting

确保您使用 setOpaque(false) 使组件透明,否则您可能会遇到其他问题。您可能还想使用 setBorderPaintsetFocusPaintedsetContentAreaFilled 来更改默认外观委托绘制按钮的方式