Java BuffereImage不';t从0,0开始绘制
我希望我的第一篇文章对你们来说不是太基础 我正在尝试使用BuffereImage(使用setRGB())在JCanvas上进行逐像素绘制。我想我会用一条从原点到JCanvas宽度/高度的对角线来测试所有这些。问题是我在x轴上得到了一个奇怪的偏移,我似乎无法修复 以下是问题的链接: 代码如下: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("
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