JComponents не отображается на экране с включенной двойной буферизацией - PullRequest
1 голос
/ 23 февраля 2012

Я пишу 2D-игру с помощью Swing. Для меню я использую JButtons и теперь я хочу использовать JPasswordField. Проблема в том, что: если я пытаюсь что-то написать, программа вылетает. Я обнаружил ошибку в этой единственной строке кода:

frame.getLayeredPane().paintComponents(graphics);

Поле пароля не нарисовано должным образом, и программа вылетает. Но если я не буду использовать эту строку, ни один компонент не появится. Я думаю, это потому, что я использую двойную буферизацию, но мне нужно это для самой игры.

Здесь создается JFrame:

public void createFrame() {
    RepaintManager.setCurrentManager(new RepaintManager() {
        @Override
        public void addDirtyRegion(final JComponent c, final int x, final int y, final int w, final int h) {}
        @Override
        public void addInvalidComponent(final JComponent invalidComponent) {}
        @Override
        public void markCompletelyDirty(final JComponent aComponent) {}
        @Override
        public void paintDirtyRegions() {} 
    });

    frame = new JFrame("Bubble Trouble");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    maximizeFrame(getFirstCompatibleMode(displayModes));
    //setFullScreen(getFirstCompatibleMode(displayModes));
    frame.setResizable(false);
    frame.setUndecorated(true);
    frame.setIgnoreRepaint(true);
    frame.setVisible(true);
    ((JComponent) frame.getContentPane()).setOpaque(false);

    JPanel panel = new JPanel();
    main.getComponentHandler().initComponents(panel);
    main.getKeyHandler().registerKeys(main.getComponentHandler().getPanel());
    panel.setOpaque(false);
    panel.addMouseListener(main.getMouseListener());

    frame.getContentPane().add(panel);

    frame.createBufferStrategy(2);
}

Этот метод вызывается для перекраски и обновления игры:

public void draw() {
    Graphics graphics = null;
    JFrame frame = screenHandler.getFrame();
    BufferStrategy bufferStrategy = frame.getBufferStrategy();
    try {

        graphics = (Graphics) bufferStrategy.getDrawGraphics();

        switch(main.getStatus()) {
            case MENU_MAIN:     drawMainMenu(graphics); break;
            case MENU_GAME:     drawGameMenu(graphics); break;
            case GAME:          drawGame(graphics); break;
            case LEVELCHANGE:   drawLevelChange(graphics); break;
            case SCORE:         drawScore(graphics); break;
        }
        drawHertz(graphics);

        graphics.translate(frame.getInsets().left, frame.getInsets().top);
        frame.getLayeredPane().paintComponents(graphics);

        if (!bufferStrategy.contentsLost())
            bufferStrategy.show();

    } catch (IllegalStateException e) {} 
    finally {
        if (graphics != null) graphics.dispose();
    }

    Toolkit.getDefaultToolkit().sync();

    Thread.yield();
}
...