我创建了一个具有透明背景的Custom JButton,并从graphics.drawRoundRect()中绘制了一条线,但是当我启动程序进行测试时,我的JCheckbox始终出现在按钮顶部。

一开始看起来像这样



这是在我将鼠标指针悬停在Button上之后



这是来自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);

}


我的按钮类中没有任何其他方法,除了其中带有super()的构造方法。
该类继承自JButton类,我在测试程序中将前台属性设置为Color.white,并通过添加按钮

frame.getContentPane().add(button);


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

最佳答案

您断开了油漆链,必须致电super.paintComponent

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


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

有关更多详细信息,请参见Painting in AWT and SwingPerforming Custom Painting

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

关于java - 如何从自定义JButton拦截paintComponent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28162747/

10-12 02:17