我有一个使用自定义 UI 委托(CustomButtonUI 扩展 BasicButtonUI)绘制的 JButton。CustomButtonUI 的paint() 方法绘制带有“抗锯齿”圆角的按钮,以使外观尽可能“平滑”。
每次我将鼠标拖到按钮上时,按钮的“抗锯齿”边缘都会以某种方式消失。这使按钮边缘看起来“像素化”。但是,一旦我添加了一行代码来重新绘制按钮的父级,即使我将鼠标拖到按钮上,抗锯齿也会启动。
现在,我的问题与这是否是个好主意有关?毕竟,我会从子组件重新绘制父组件。我想知道这是否会导致重绘循环?如果父母试图重绘它的孩子,而孩子试图重绘它的父母——那么我假设我们正在谈论一个循环。
我已附上我的代码作为参考。任何意见都非常欢迎!
public class JCustomButtonUI extends BasicButtonUI {
@Override
public void installUI(JComponent c) {
super.installUI(c);
AbstractButton b = (AbstractButton) c;
b.setBorderPainted(false);
}
@Override
public void paint(Graphics g, JComponent c) {
//Cast the Graphics instance to a Graphics2D instance.
Graphics2D g2d = (Graphics2D) g;
JButton b = (JButton) c;
//Repaint parent component to make sure that we get "antialiased"
//edges.
b.getParent().repaint();
//Get the component's height and width.
int w = (int) g.getClipBounds().getWidth();
int h = ((int) g.getClipBounds().getHeight());
//Make sure the button is drawn with "antialiased" edges.
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.GRAY);
g2d.fillRoundRect(0, 0, w, h, w, h);
}
}
更新 1
只是为了说明别名和抗锯齿边框,请看下面的两张图片。当我(来自 ButtonUI 的 paint() 方法)手动调用父 JPanel 的 repaint 方法时,所有边框都始终完美抗锯齿。但是,当我不手动调用父 JPanel 的 repaint 方法时,一旦我将鼠标悬停在按钮上,边框将不再抗锯齿。
更新 2
我在 Snipt 上共享了由一个 JPanel、一个 JSlider 和几个 JButton 组成的整个“组件”。请从http://snipt.org/wnllg获取。
更新 3
看来我已经设法让它工作了。我没有在其paintComponent() 方法中绘制JPanel 的背景,而是创建了一个安装在JPanel 上的JCustomPanelUI。我不认为这就是解决方案本身,但我没有使用 Graphics 实例的宽度和高度,而是尝试使用 JPanel 本身的宽度和高度。当我使用 Graphics 实例的宽度和高度时,我不太确定为什么会出错。我认为 Graphics 实例的宽度和高度已经针对 JPanel 组件的尺寸进行了“准备”。您可以在这里查看最终组件:http: //snipt.org/wnlli,