2014-03-30 1 views
0

에서 그려지지 않습니다. 내 첫 번째 소식이 모두에게 너무 기본 적이기를 바랍니다.BufferedImage가 0

(setRGB()를 사용하여) BufferedImage를 사용하여 JCanvas에서 픽셀 당 드로잉을 수행하려고합니다. 나는 모든 것이 JCanvas의 너비/높이에 대한 원점에서 하나의 대각선으로 작업하고 있는지 테스트 할 것이라고 생각했습니다. 문제는 내가 해결할 수없는 x 축에서 이상한 오프셋을 얻는다는 것입니다.

가 여기에 문제에 대한 링크입니다 : http://i811.photobucket.com/albums/zz31/bohngy/problemMandel_zpsae20713a.jpeg

enter image description here

여기에 코드입니다 :

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

이 줄이 나를 만드는 약간 긴장 : 모든 문제는이 코드에서처럼 볼 수 있었다 고려

한 가지 방법'I.setRGB (X, X, Color.GREEN.getRGB());'와 'x '를 매개 변수로 두 번 사용하기 – BitNinja

답변

0

모든 BufferedImage 오브젝트의 좌상 구석의 좌표는 (0, 0). BufferedImage를 구축하기 위해서 사용되는 Raster는, minX = 0, minY = 0가 아니면 안됩니다.

거기에 문제가 있습니다.

의 JavaDoc에 대한 BufferedImage

편집 :

또한 루프에서이 제거 :

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

일반 문제

  • 특히 (JFrame 확장하지 마,하지 paint 메서드를 JFrame보다 우선 적용하십시오. 대신, 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); 
     } 
    } 

} 
+1

당신의 답을 제외하고는 비교적 정확 합니다만, ImagePanel 대신에 JLabel을 사용하여 똑같은 것을 달성 할 수 있습니다. +1 – MadProgrammer

+0

@MadProgrammer : 원래, 그는 ImagePanel은 이미지를 수동으로 페인팅하고 있었고, 이것이 JPanel # paintComponent에서 어떻게 수행되는지를 보여줍니다. 물론, * 어떻게 든 * 이미지를 표시하는 경우, '... 추가 (새 JLabel (새로운 ImageIcon (이미지)))'가 올바르게 수행됩니다. – Marco13

관련 문제