【发布时间】:2015-10-02 11:18:59
【问题描述】:
我遇到了这种奇怪的抗锯齿:
左边的形状和右边的形状完全共享曲线部分。但是,会出现一条黑色曲线并中断绘图和颜色的平滑度。这是一个示例,旨在显示问题。
起初,用不同的颜色,我以为是错觉,(打开和关闭下面注释的 CHECK_# 行)。但是当使用相同的颜色时,就会发生这种情况。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class darkBorders extends JPanel {
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.BLACK);
//g2.setColor(Color.WHITE); //CHECK_1
g2.fill(g2.getClip());
int r = 100;
g2.translate(this.getWidth() / 2 - r, this.getHeight() / 2 - r);
Path2D p = new Path2D.Double();
p.moveTo(0, 0);
p.lineTo(r, 0);
p.quadTo(2 * r, r, r, 2 * r);
p.lineTo(0, 2 * r);
p.closePath();
g2.setColor(new Color(0xFF9900));
//g2.setColor(new Color(0x00CC66)); //CHECK_2
g2.fill(p);
p.reset();
p.moveTo(2 * r, 0);
p.lineTo(r, 0);
p.quadTo(2 * r, r, r, 2 * r);
p.lineTo(2 * r, 2 * r);
p.closePath();
g2.setColor(new Color(0xFF9900));
g2.fill(p);
g2.dispose();
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setContentPane(new darkBorders());
frame.setSize(500, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
有什么办法可以解决这个问题吗? 非常感谢。
【问题讨论】:
-
首先使用
double值作为您的坐标。接下来,不要使用fill(clip),剪辑矩形不会总是匹配组件坐标空间(已翻译)。将面板的backgroundColor设置为BLACK并简单地调用super.paintComponent并让它填充背景 -
感谢您的建议,它们总是很有帮助。这是显示问题的示例代码。 Path2D 接受浮点值和十进制值,因此使用整数值并在最后将它们转换为双精度值。
-
我以
2d为例,虽然它不能直接解决问题,但它使它变得更好。我还使用了BasicStroke设置为大约1.5f这似乎有所作为
标签: java swing paintcomponent graphics2d antialiasing