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

Чтобы избежать каких-либо мерцаний после того, как 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?


person Ernestas Gruodis    schedule 11.09.2013    source источник
comment
Если вы хотите избежать мерцания, вам следует избегать рисования непосредственно в окне, вместо этого рисуйте что-то вроде JPanel, которое имеет двойную буферизацию.   -  person MadProgrammer    schedule 11.09.2013
comment
Основная идея состоит в том, чтобы упаковать окно и расположить его где-нибудь за пределами экрана, прежде чем сделать его видимым, а затем переместить в видимую область экрана.   -  person MadProgrammer    schedule 11.09.2013
comment
@MadProgrammer это распространенная проблема, вызванная по умолчанию, когда вы повторно используете всплывающий контейнер, вы можете видеть, перехватывать предыдущее значение после Xxx.setVisible ....   -  person mKorbel    schedule 11.09.2013
comment
Пробовал someJPanel, а также someJLabel в validate(); - безуспешно.. Может быть, я попытаюсь установить JLabel текст прямо перед закрытием диалога.   -  person Ernestas Gruodis    schedule 11.09.2013
comment
Да, я пытаюсь повторно использовать окно.   -  person Ernestas Gruodis    schedule 11.09.2013
comment
не обращайтесь к компонентам Swing из EDT (как вы делаете, запуская их макет). Кстати: та же процедура, что и в прошлый раз - показать SSCCE, демонстрирующий проблему, так как мерцание необычно :-)   -  person kleopatra    schedule 11.09.2013
comment
Постараюсь как-нибудь заснять это на видео, и посмотрю в замедленной съемке, что происходит. Нет такого софта, постараюсь найти (сейчас оставляю ПК).   -  person Ernestas Gruodis    schedule 11.09.2013
comment
Видео не надо. Опубликуйте SSCCE, чтобы мы могли сами запустить код и посмотреть, что именно вы делаете.   -  person camickr    schedule 11.09.2013
comment
Я нашел здесь ту же проблему. Неужели невозможно повторно использовать JWindow вместо создания нового?   -  person Ernestas Gruodis    schedule 16.09.2013
comment
нет, это не невозможно - может быть, вы делаете что-то не так или, может быть, проблема сильно зависит от контекста: потому что (до сих пор) никто не может воспроизвести мерцание с SSCCE в вашем другом вопросе - даже с нарушением EDT, на котором вы настаиваете, нет фиксирую ;-)   -  person kleopatra    schedule 16.09.2013
comment
Хорошо, мой вопрос: если компонент не виден, и я вношу в него какие-то изменения, значит, изменения применяются ПОСЛЕ того, как компонент становится видимым? В смысле старая графика еще видна, но постепенно перекрашивается новой?   -  person Ernestas Gruodis    schedule 16.09.2013


Ответы (1)


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

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

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

person Bepo    schedule 25.06.2015
comment
Да, я перестал использовать SwingWorker в таких случаях, но заметил, что getGraphics().update() справляется со своей задачей. - person Ernestas Gruodis; 25.06.2015