2012-03-28 2 views
1

이전에이 문제가 발생한 사람이 있습니까? 때로는 문자열이 표시되지만 때로는 문자열의 일부가 표시되지 않는 경우도 있습니다. BufferedImage 대신에 VolatileImage를 백 버퍼로서 사용하면 (자) 문제가 악화됩니다.Java Graphics.drawString이 항상 작동하지 않는 경우

public class Game3D { 

public static void main(String[] args) { 
    Game3D game = new Game3D(); 
    game.start(); 
} 

public Game3D() { 
    frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    canv = new GameCanvas(); 
    canv.setPreferredSize(new Dimension(800, 600)); 
    frame.add(canv); 

    frame.pack(); 
    frame.setVisible(true); 
} 
private JFrame frame; 
private GameCanvas canv; 

public void start() { 
    canv.createBuffer(canv.getPreferredSize()); 
    loadingScreen("Loading", 10); 
} 

public void loadingScreen(String msg, int done) { 
    Graphics2D g = canv.img.createGraphics(); 
    try { 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, canv.getWidth(), canv.getHeight()); 

     int sizeX = 400, sizeY = 50; 
     int loadX = canv.getWidth()/2 - sizeX/2; 
     int loadY = canv.getHeight()/2 - sizeY/2; 

     g.setColor(Color.RED); 
     g.drawRect(loadX, loadY, sizeX, sizeY); 
     g.fillRect(loadX + 2, loadY + 2, (int) (sizeX/100F * done), sizeY - 3); 

     int textX = canv.getWidth()/2 - g.getFontMetrics().stringWidth(msg)/2; 
     int textY = canv.getHeight()/2 - g.getFontMetrics().getHeight()/2; 

     g.setColor(Color.WHITE); 
     g.setFont(canv.font); 
     g.drawString(msg, textX, textY); 

    } finally { 
     g.dispose(); 
    } 
} 

은}

클래스 GameCanvas를 내가 당신이 내가 '하지만 제대로 표시 그리는 것을 갖기 위해 frame.repaint();를 호출 할 필요가 있다고 생각 캔버스 {

GameCanvas() { 
} 
BufferedImage img; 
Font font; 

void createBuffer(Dimension dim) { 
    img = new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_INT_ARGB); 
    font = new Font(Font.MONOSPACED, Font.PLAIN, 16); 
} 

@Override 
public void paint(Graphics g) { 
    g.drawImage(img, 0, 0, null); 
} 

}

+0

주 스레드의 코드가 스윙 스레드에서 실행되고 있지 않습니다. SwingUtilities.invokeLater()를 사용해보십시오. http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html – Bill

+0

스윙 스레드 내부에서 프레임 초기화 코드를 실행했는데 문제가 해결 된 것 같습니다. 고마워. – Colby

+0

AWT 구성 요소와 스윙을 혼합하지 마십시오! –

답변

0

코드가 SWING 스레드에서 실행되어야했습니다!

0

를 확장 전적으로 확실하지 않습니다. Java GUI를 사용할 때이 문제가 내 자신의 문제 중 일부라는 것을 기억합니다.

+0

글쎄, 문자열 외에 GUI 구성 요소를 더 많이 그려서 표시하고 있습니다. 이 시점에서, 프레임을 BufferedImage에 한 번만 렌더링하고 나중에 다시 칠하기 위해 저장합니다. drawString 호출은 실제로 BufferedImage에 페인팅되지 않습니다. 또한 VolatileImage를 사용하면 문제가 악화되는 것 같습니다. – Colby

관련 문제