Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как перерисовать - подготовить графику JWindow перед тем, как сделать ее видимой?

Автор вопроса: Ernestas GruodisОтветов: 1

Чтобы избежать каких-либо мерцаний после того, как JWindow установлено значение visible, я сделал это так, но все же я вижу в течение нескольких миллисекунд какой-то JLabel (дерево: JWindow -> JPanel -> JLabel) старый текст, затем текст меняется на новое значение (это необходимо сделать до того, как JWindow станет видимым):

public SomeExtendedJWindow extends SomeJWindow {

    @Override
    public void setVisible(boolean visible) {
        if (visible) {
            class doGraphics extends SwingWorker<Void, Object> {

                @Override
                public Void doInBackground() {
                    validate();
                    pack();
                    return null;
                }

                @Override
                protected void done() {
                    SomeJWindow.super.setVisible(true);
                }
            }
            (new doGraphics()).execute();
        }
    }
}

Может быть, мне также следует проверить или сделать что-то с JLabels?

  • Если вы хотите избежать мерцания, вам следует избегать рисования непосредственно в окне, вместо этого рисуйте что-то вроде JPanel, которое имеет двойную буферизацию. MadProgrammer 11.09.2013
  • Основная идея состоит в том, чтобы упаковать окно и расположить его где-нибудь за пределами экрана, прежде чем сделать его видимым, а затем переместить в видимую область экрана. MadProgrammer 11.09.2013
  • @MadProgrammer это распространенная проблема, вызванная по умолчанию, когда вы повторно используете всплывающий контейнер, вы можете видеть, перехватывать предыдущее значение после Xxx.setVisible .... mKorbel 11.09.2013
  • Пробовал someJPanel, а также someJLabel в validate(); - безуспешно.. Может быть, я попытаюсь установить JLabel текст прямо перед закрытием диалога. Ernestas Gruodis 11.09.2013
  • Да, я пытаюсь повторно использовать окно. Ernestas Gruodis 11.09.2013
  • не обращайтесь к компонентам Swing из EDT (как вы делаете, запуская их макет). Кстати: та же процедура, что и в прошлый раз - показать SSCCE, демонстрирующий проблему, так как мерцание необычно :-) kleopatra 11.09.2013

javagraphicsswingswingworker

Ответы

Ответ 1 · Bepo

Попробуйте это с: jLabel.setText("new text"), прежде чем сделать диалоговое окно видимым (SomeJWindow.setVisible(true);).

Во всяком случае, нет необходимости использовать SwingWorker. Я бы не переопределял setVisible(boolean visible).

Просто установите текст на метке перед вызовом функции someExtendedJWindow .setVisible(true).

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы