Java BuffereImage不';t从0,0开始绘制

Java BuffereImage不';t从0,0开始绘制,java,image,swing,jframe,paint,Java,Image,Swing,Jframe,Paint,我希望我的第一篇文章对你们来说不是太基础 我正在尝试使用BuffereImage(使用setRGB())在JCanvas上进行逐像素绘制。我想我会用一条从原点到JCanvas宽度/高度的对角线来测试所有这些。问题是我在x轴上得到了一个奇怪的偏移,我似乎无法修复 以下是问题的链接: 代码如下: public class Mandelbrot extends JFrame { private BufferedImage I; public Mandelbrot() { super("

我希望我的第一篇文章对你们来说不是太基础

我正在尝试使用BuffereImage(使用setRGB())在JCanvas上进行逐像素绘制。我想我会用一条从原点到JCanvas宽度/高度的对角线来测试所有这些。问题是我在x轴上得到了一个奇怪的偏移,我似乎无法修复

以下是问题的链接:

代码如下:

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);
  }
}
公共类Mandelbrot扩展JFrame{
私有缓冲映像I;
公共曼德尔布罗特(){
超级(“Mandelbrot集”);
设置大小(600600);
可设置大小(假);
setDefaultCloseOperation(关闭时退出);
I=新的BuffereImage(getWidth(),getHeight(),BuffereImage.TYPE_INT_RGB);
对于(int x=0;x
所有BuffereImage对象的左上角坐标为(0,0)。因此,用于构建BuffereImage的任何光栅必须具有minX=0和minY=0

这就是你的问题所在

JavaDoc for

编辑:

还要将其从循环中删除:

for (int y = 0; y < getWidth(); y++) {
    I.setRGB(x, x, Color.GREEN.getRGB());
}
for(int y=0;y
所有BuffereImage对象的左上角坐标为(0,0)。因此,用于构建BuffereImage的任何光栅必须具有minX=0和minY=0

这就是你的问题所在

JavaDoc for

编辑:

还要将其从循环中删除:

for (int y = 0; y < getWidth(); y++) {
    I.setRGB(x, x, Color.GREEN.getRGB());
}
for(int y=0;y
所有BuffereImage对象的左上角坐标为(0,0)。因此,用于构建BuffereImage的任何光栅必须具有minX=0和minY=0

这就是你的问题所在

JavaDoc for

编辑:

还要将其从循环中删除:

for (int y = 0; y < getWidth(); y++) {
    I.setRGB(x, x, Color.GREEN.getRGB());
}
for(int y=0;y
所有BuffereImage对象的左上角坐标为(0,0)。因此,用于构建BuffereImage的任何光栅必须具有minX=0和minY=0

这就是你的问题所在

JavaDoc for

编辑:

还要将其从循环中删除:

for (int y = 0; y < getWidth(); y++) {
    I.setRGB(x, x, Color.GREEN.getRGB());
}
for(int y=0;y
一般问题

  • 不要扩展
    JFrame
    (尤其不要覆盖
    JFrame
    paint
    方法)。相反,在
    paintComponent
    方法中绘制扩展
    JPanel
  • 从事件分派线程创建GUI
产生意外结果的主要原因是您正在创建一个具有框架大小的图像,但框架也有一个标题栏和边框,这些是图像的“覆盖”部分。实际可用于绘制的区域的大小小于总框架大小。此外,只要框架在屏幕上还不可见,那么
getWidth()
getHeight()
方法可能会返回垃圾

考虑到所有这些因素的一种方法可能如下所示:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Mandelbrot 
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new GridLayout(1, 1));

        BufferedImage image = createImage(500, 500);
        ImagePanel imagePanel = new ImagePanel(image);
        frame.getContentPane().add(imagePanel);

        frame.pack();
        frame.setVisible(true);
    }

    private static BufferedImage createImage(int w, int h)
    {
        BufferedImage image = new BufferedImage(w, h,
            BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < w; x++)
        {
            image.setRGB(x, x, Color.GREEN.getRGB());
        }
        return image;
    }

    static class ImagePanel extends JPanel
    {
        private final BufferedImage image;

        ImagePanel(BufferedImage image)
        {
            this.image = image;
        }

        @Override
        public Dimension getPreferredSize()
        {
            if (super.isPreferredSizeSet())
            {
                return super.getPreferredSize();
            }
            return new Dimension(image.getWidth(), image.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, null);
        }
    }

}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.GridLayout;
导入java.awt.image.buffereImage;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
公共级曼德布罗特
{
公共静态void main(字符串[]args)
{
SwingUtilities.invokeLater(新的Runnable()
{
@凌驾
公开募捐
{
createAndShowGUI();
}
});
}
私有静态void createAndShowGUI()
{
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(新的GridLayout(1,1));
BuffereImage=createImage(500500);
ImagePanel ImagePanel=新的ImagePanel(图像);
frame.getContentPane().add(imagePanel);
frame.pack();
frame.setVisible(true);
}
专用静态缓冲区映像createImage(int w,int h)
{
BuffereImage=新的BuffereImage(w,h,
BuffereImage.TYPE_INT_RGB);
对于(int x=0;x
一般问题

  • 不要扩展
    JFrame
    (尤其不要覆盖
    JFrame
    paint
    方法)。相反,在
    paintComponent
    方法中绘制扩展
    JPanel
  • 从事件分派线程创建GUI
产生意外结果的主要原因是您正在创建一个具有框架大小的图像,但框架也有一个标题栏和边框,这些是图像的“覆盖”部分。实际可用于绘制的区域的大小小于总框架大小。另外,
getWidth()
getHeight()
me