2012-03-28 10 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

SwingとAWTコンポーネントを混在させないでください! –

答えて

0

SWINGスレッドでコードを実行する必要がありました。

0

を拡張します完全にはっきりしない。私はちょうどこれがJava GUIを使用するときに私自身の問題のいくつかの原因であることを覚えています。

+0

文字列以外のGUIコンポーネントが描画され、表示されています。この時点で、フレームをBufferedImageに一度だけレンダリングし、後で再描画するためにそのフレームを保存します。 drawStringの呼び出しは、実際にBufferedImageにペイントされることはありません。また、VolatileImageを使用すると問題が悪化するようです。 – Colby

関連する問題