我希望我的第一篇文章对于所有人来说都不是太基础。
我尝试使用BufferedImage(使用setRGB())在JCanvas上进行每像素绘制。我以为我会测试所有正在使用从原点到JCanvas的宽度/高度的单个对角线。麻烦的是我在x轴上得到一个奇怪的偏移,我似乎无法修复!
这是问题的链接: http://i811.photobucket.com/albums/zz31/bohngy/problemMandel_zpsae20713a.jpeg
以下是代码:
public class Mandelbrot extends JFrame {
private BufferedImage I;
public Mandelbrot() {
super("Mandelbrot Set");
setSize(600, 600);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
I = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < getHeight(); x++) {
for (int y = 0; y < getWidth(); y++) {
I.setRGB(x, x, Color.GREEN.getRGB());
}
}
}
@Override
public void paint(Graphics g) {
g.drawImage(I, 0, 0, this);
}
public static void main(String[] args) {
new Mandelbrot().setVisible(true);
}
}
答案 0 :(得分:3)
一般问题
JFrame
(特别是,不要覆盖paint
的{{1}}方法。相反,在JFrame
方法中绘制一个扩展paintComponent
出现意外结果的主要原因是您正在创建一个具有框架大小的图像 - 但框架还有一个标题栏和一个边框,这些是&#34;覆盖&#34;部分图像。实际可用于绘画的区域大小小于总帧大小。此外,只要框架在屏幕上尚未显示,JPanel
和getWidth()
方法可能会返回垃圾。
考虑所有这些的一种方法可能就像在这个片段中一样:
getHeight()
答案 1 :(得分:0)
所有BufferedImage对象的左上角坐标为(0,0)。因此,用于构造BufferedImage的任何Raster必须具有minX = 0和minY = 0。
这就是你的问题。
的JavaDoc编辑:
同样从循环中删除它:
for (int y = 0; y < getWidth(); y++) {
I.setRGB(x, x, Color.GREEN.getRGB());
}