2012-03-28 8 views
1

Hat schon mal jemand auf dieses Problem gestoßen? Manchmal wird die Zeichenkette angezeigt, manchmal die Hälfte, manchmal nichts davon. Das Problem wird schlimmer, wenn Sie VolatileImage anstelle von BufferedImage als Backbuffer verwenden.Java Graphics.drawString funktioniert nicht immer

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(); 
    } 
} 

}

Klasse Gamecanvas erstreckt Leinwand {

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

Zum einen läuft Ihr Code in der Hauptsache nicht im Swing-Thread. Versuchen Sie es mit SwingUtilities.invokeLater(). http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html – Bill

+0

Ich habe den Frame-Initialisierungscode innerhalb der Swing-Thread ausgeführt, und es scheint das Problem behoben zu haben. Danke, Mann. – Colby

+0

Nicht Swing mit AWT-Komponenten mischen! –

Antwort

0

Der Code musste im SWING-Thread ausgeführt werden!

0

Ich glaube, Sie müssen möglicherweise frame.repaint(); anrufen, um zu dem, was Sie richtig zeigen, zeichnen obwohl ich Ich bin mir nicht ganz sicher. Ich erinnere mich nur daran, dass dies die Ursache einiger meiner eigenen Probleme bei der Verwendung von Java-GUIs war.

+0

Nun, es zeichnet mehr GUI-Komponenten neben der Zeichenfolge, und sie werden angezeigt. An diesem Punkt rendere ich den Rahmen nur einmal zu einem BufferedImage, und speichere diesen später zum Neuanstrich. Der drawString-Aufruf wird niemals tatsächlich in BufferedImage gezeichnet. Außerdem scheint sich das Problem bei Verwendung von VolatileImage zu verschlimmern. – Colby

Verwandte Themen