Java Graphics.drawString не всегда работает

Кто-нибудь когда-нибудь сталкивался с этой проблемой раньше? Иногда отображается строка, иногда половина, иногда ничего. Проблема усугубляется при использовании VolatileImage вместо BufferedImage в качестве резервного буфера.

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 расширяет Canvas {

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

}


person Colby    schedule 28.03.2012    source источник
comment
Во-первых, ваш основной код не работает в потоке качелей. Попробуйте использовать SwingUtilities.invokeLater(). java.sun.com/products/jfc/tsc/articles/ темы/threads1.html   -  person Bill    schedule 28.03.2012
comment
Я запустил код инициализации фрейма внутри потока свинга, и, похоже, проблема была устранена. Спасибо чувак.   -  person Colby    schedule 28.03.2012
comment
Не смешивайте Swing с компонентами AWT!   -  person Andrew Thompson    schedule 28.03.2012


Ответы (2)


Я думаю, вам может понадобиться вызвать frame.repaint();, чтобы то, что вы рисуете, отображалось правильно, хотя я не совсем уверен. Я просто помню, что это было причиной нескольких моих собственных проблем при использовании графического интерфейса Java.

person jrbalsano    schedule 28.03.2012
comment
Что ж, он рисует больше компонентов графического интерфейса помимо строки, и они отображаются. На данный момент я только один раз визуализирую кадр в BufferedImage, а затем сохраняю его позже для перерисовки. Вызов drawString на самом деле никогда не отрисовывает BufferedImage. Кроме того, проблема усугубляется при использовании VolatileImage. - person Colby; 28.03.2012

Код нужно было запускать в потоке SWING!

person Colby    schedule 18.06.2012