2014-05-15 5 views
0

내 프로젝트의 가장 작은 SSCCE 인입니다. 누군가 내가 왜 Render에 생성 된 사각형이 보이지 않는지 설명 할 수 있습니까? 내가 어떤 도움을 주셔서 감사합니다그래픽을 그릴 때 자바가 그려지지 않을 때

는,이 코드는 컴파일 가능한입니다

매우 중요합니다, 그리고 그것을 실행하지만 내가 말했듯이 광장을 표시하지 않습니다.

루프 클래스

public class Foo { 
    public void update() { 
    for (int i = 0; i < 20; i++) 
     System.out.println("foo"); 
    } 
} 

렌더링 클래스

import java.awt.Graphics2D; 

public class Render { 

    private static Render renderManager = new Render(); 

    public void setRenderState(Graphics2D graphic) { 

    showRender(graphic); 

    } 

    private void showRender(Graphics2D graphic) { 
    graphic.fillRect(4, 3, 40, 40); 

    } 

    public static Render getRenderManagerInstance() { 
    return renderManager; 
    } 
} 

Main 클래스

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 

public class Main { 

    private static final Main mainFrame = new Main(); 
    private final JFrame frame; 

    private Main() { 
    frame = new JFrame(); 
    frame.setUndecorated(true); 
    frame.add(new MyPanel()); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
    } 

    public static Main getMainFrameInstance() { 
    return mainFrame; 
    } 


    public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     Main.getMainFrameInstance(); 
     } 
    }); 
    } 

} 

MyPanel 클래스

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 

import javax.swing.JPanel; 

public class MyPanel extends JPanel implements Runnable { 

    private static final long serialVersionUID = 1L; 

    // thread and loop 
    private Thread thread; 
    private boolean running; 
    private int FPS = 60; 
    private long targetTime = 1000/FPS; 
    private long start; 
    private long elapsed; 
    private long wait; 

    // image 
    public BufferedImage image; 
    // foo 
    private Foo foo; 

    private Render render = Render.getRenderManagerInstance(); 

    public MyPanel() { 
    setPreferredSize(new Dimension(700, 700)); 
    setFocusable(true); 
    requestFocus(); 
    } 

    public void addNotify() { 
    super.addNotify(); 
    if (thread == null) { 
     thread = new Thread(this); 
     thread.start(); 
    } 
    } 

    // prevent to be done all method. 
    private synchronized void initGraphic() { 
    image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
    foo = new Foo(); 
    running = true; 

    } 

    public void run() { 
    initGraphic(); 

    // loop 
    while (running) { 
     start = System.nanoTime(); 
     foo.update(); 
     repaint(); 
     elapsed = System.nanoTime() - start; 
     wait = (targetTime - elapsed/1000000) - 8; 
     if (wait <= 0) 
     wait = 6; 

     try { 
     Thread.sleep(wait); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 

    } 
    } 

    @Override 
    public void paintComponent(Graphics graphics) { 
    super.paintComponent(graphics); 
    graphics = (Graphics2D) image.getGraphics(); 
    ((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    ((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
    render.setRenderState((Graphics2D) graphics); 
    } 

답변

2

두 가지 문제 :

image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 

확인이 시점에서 WIDTHHEIGHT의 값. 나는 그들이 당신이 기대하는 것이라고 생각하지 않습니다. 아마도 이것은 컴포넌트가 구현되기 전에 호출 될 것입니다.

public void paintComponent(Graphics graphics) { 
    super.paintComponent(graphics); 
    graphics = image.getGraphics(); 
    ((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    ((Graphics2D) graphics).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
    render.setRenderState((Graphics2D) graphics); 
} 

당신은에 이미지를 을 그리는,하지만 당신은 결코 구성 요소에 이미지 자체를 그리기되지 않습니다. 원래 구성 요소의 Graphics 객체에 대한 참조를 유지 한 다음 마지막에 해당 구성 요소에 이미지를 그립니다.

public void paintComponent(Graphics panelG2d) { 
    super.paintComponent(panelG2d); 

    Graphics2D imageG2d = (Graphics2D) image.getGraphics(); 

    imageG2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    imageG2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
    render.setRenderState(imageG2d); 

    panelG2d.drawImage(image, 0, 0, this); 
} 
+0

나는 너비와 높이의 오해에 동의한다. 나는 방금 고치고 대답의 두 번째 부분을 이해하지 못한다. 좀 더 명확 할 수 있니? 고마워, @whiskeyspider – OiRc

+0

@CiMat 나는 그것을 업데이트했다. . – whiskeyspider

+0

신의 축복은 내가이 일로 싸우는 날이다. 그리는 것이 한 가지 더해야한다. 또는 paintcomponent는 자원 자체를 파괴 할 것인가? @whiskeyspider – OiRc

0

당신은 MyPanel에 image를 추가하지 마십시오. 그것을 추가해야합니다. initGraphic에서 다음과 같이 뭔가를 할 :

private synchronized void initGraphic() { 
    image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
    this.add(image); //New. 
    foo = new Foo(); 
    running = true; 

} 
+0

그것은 작동하지 않습니다. – OiRc