我创建了一个具有透明背景的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 Swing和Performing Custom Painting
确保使用
setOpaque(false)
使组件透明,否则可能会遇到其他问题。您可能还想使用setBorderPaint
,setFocusPainted
和setContentAreaFilled
更改默认外观委托绘制按钮的方式关于java - 如何从自定义JButton拦截paintComponent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28162747/