如何从自定义 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)
使组件透明,否则您可能会遇到其他问题。您可能还想使用 setBorderPaint
、setFocusPainted
和 setContentAreaFilled
来更改默认外观委托绘制按钮的方式
我创建了一个具有透明背景的自定义 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)
使组件透明,否则您可能会遇到其他问题。您可能还想使用 setBorderPaint
、setFocusPainted
和 setContentAreaFilled
来更改默认外观委托绘制按钮的方式