Я пишу 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();
}