【发布时间】:2015-03-10 06:24:02
【问题描述】:
我的问题如下:我的实际项目(下面的代码是其简化版本)涉及许多同心圆(每个都有不同的颜色)和使用计时器的动画。圆圈是使用 drawOval 方法绘制的。
我的问题是,当绘制这些同心圆时,这些圆的轮廓中似乎有很多间隙,我猜这与圆由像素和线条组成的事实有关是任何形状,所以圆形的外观是一种错觉。我这样说是因为当我将 drawOval 方法换成 drawRect 时,绘画看起来就像你所期望的那样。
在弄乱其他人的代码时,我发现使用 RenderingHints 以某种方式解决了这个问题,但是将动画减慢到了我认为可以接受的程度。
下面是绘制的截图。我们看到的是:
这是我的简化代码:
Test10
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
public class Test10 extends JPanel {
Circle[] circles;
public static void main(String[] args) {
new Test10().go();
}
void go() {
JFrame frame = new JFrame("Circle Test");
frame.getContentPane().add(this);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
circles = new Circle[200];
for (int i = 0; i < 200; i++) {
circles[i] = new Circle(i, ((2 * ( 200 - i) + 1)));
}
repaint();
frame.setPreferredSize(new Dimension(500,500));
frame.pack();
frame.setVisible(true);
}
public void paintComponent(Graphics g) {
for (Circle circle : circles ) {
circle.draw(g);
}
}
}
圈子
import java.awt.Graphics;
public class Circle {
int topLeft;
int diameter;
public Circle(int topLeft, int diameter) {
this.topLeft = topLeft;
this.diameter = diameter;
}
void draw(Graphics g) {
g.drawOval(topLeft, topLeft, diameter, diameter);
}
}
谁能向我解释a)为什么会发生这种情况,b)如何克服这个问题。
更新
尝试了各种方法,包括从最外圈开始并使用 fillOval 而不是 drawOval,以及使用更高的 stroke 值,我仍然发现我有某些人工制品出现的问题与 Pavel 发布的屏幕截图相似。这是我运行动画的完整应用程序的屏幕截图,如果您仔细观察,您会发现大多数给定圆圈的颜色不一致,从而导致这些奇怪的结果。它们的分布实际上遵循与上面发布的屏幕截图相同的模式,因此这些选项显然没有解决一些基本问题。这是我的屏幕截图:
【问题讨论】:
-
画一个实心圆或两个同心圆不就行了吗?
-
查看我的帖子顶部,在完整的应用程序中,每个圆圈都有不同的颜色,创建了一系列漂亮的同心圆。这就是我不使用fillOval的原因,无论如何谢谢:P
-
您是否正在实施 Futurama 的催眠蟾蜍? ;-)
标签: java graphics paintcomponent