Нужно ли вызывать setDoubleBuffered на JPanel? - PullRequest
0 голосов
/ 29 октября 2018

В руководстве по Java сказано, что двойная буферизация включена по умолчанию во многих компонентах.

Swing использует эту технику во многих своих компонентах, обычно включаемых по умолчанию с использованием метода setDoubleBuffered.

isDoubleBuffered возвращает true для JPanel. Стоит ли тогда называть setDoubleBuffered(true) в игре с доской JPanel? (Необходим для уменьшения мерцания и более плавной анимации.)

Это может быть логичным выводом, но по моему опыту, isFocusable возвращает true, но нам нужно вызвать setFocusable несмотря на то, что мы можем обрабатывать ключевые события.

Редактировать

Я добавил несколько фрагментов кода.

private void initBoard() {
    ...
    setDoubleBuffered(true); // Is it necessary?

    // isFocusable returns true, but when setFocusable is not called
    // key events are not processed
    setFocusable(true); 

    addKeyListener(new TAdapter());

    exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(() -> {
        doGameCycle();       
    }, INITIAL_DELAY, PERIOD, TimeUnit.MILLISECONDS);
   ...
}

private void doGameCycle() {

    updateBalloons();
    repaint();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    if (isRunning) {
        doDrawing(g);
    } else {
        gameOver(g);
    }

    Toolkit.getDefaultToolkit().sync();
}  

private class TAdapter extends KeyAdapter {

    @Override
    public void keyPressed(KeyEvent e) {
        ...
        System.out.println("key pressed");
        ...
    }
}

1 Ответ

0 голосов
/ 29 октября 2018

isDoubleBuffered включено по умолчанию в JPanel. Вам не нужно звонить во второй раз. Если ваш код рисования написан правильно и вызывается с использованием правильных событий, то все должно быть хорошо. Обычно вам нужно переопределить paintComponent и обработать все рисунки для классов свинга java. Затем для запроса обновления вам нужно позвонить repaint(). Это все. Чтобы помочь вам больше, мне нужно увидеть ваш код рисования, поэтому, пожалуйста, включите его в этот вопрос, если вам нужна дополнительная помощь. Я не знаю о каких-либо проблемах с isFocusable и setFocusable. Можете ли вы привести какой-либо пример кода, показывающего такое поведение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...