Мерцание/мигание JDialog в качестве уведомления

Я использую JDialog для отображения уведомлений в правом нижнем углу моего приложения. Я показываю до 4 уведомлений, и самое последнее отображается сверху. Уведомления отображаются в соответствии с содержимым с сервера, поэтому может быть только 1 уведомление или 3, максимум 4. Это приводит к изменению размера JDialog, а изменение размера приводит к изменению местоположения JDialog, чтобы всегда быть выровненным в правом нижнем углу. Изменение местоположения при каждом новом поступлении уведомления вызывает мерцание JDialog.

Ниже приведен код, который я вызываю каждый раз, когда приходит новое уведомление:

private void updateDialog()
{

    Point p = frame.getLocationOnScreen();
    p.x += frame.getWidth()-getWidth()-5;
    p.y += frame.getHeight()-getHeight()-25;

    setLocation(p); 
    pack();
    repaint();
}

Была ли у кого-нибудь похожая проблема? Как вы это решили? Любые другие советы о том, что я должен попытаться сделать?


person Ivansek    schedule 22.03.2012    source источник
comment
Опубликуйте SSCCE (sscce.org), и мы, возможно, найдем вашу проблему. Но мерцать не должно.   -  person Guillaume Polet    schedule 22.03.2012
comment
@Guillaume Polet SSCCE сегодня недоступен, для меня :-), я отправил запрос его величеству об этом :-)   -  person mKorbel    schedule 22.03.2012
comment
@mKorbel Я только что попробовал еще раз, и все в порядке. Все еще вниз для вас? Кстати, его величество? Нет, просто Хе-мужчина, властелин вселенной подойдет. ;)   -  person Andrew Thompson    schedule 22.03.2012
comment
@Andrew Thompson происходит что-то не так, без изменений (в том числе Swing JComponents, остальные туториалы у меня работают), возможно, наш прокси-сквид, ....... хе-хе-хе, ну правильно, без комментариев о вашем .... :- )   -  person mKorbel    schedule 22.03.2012


Ответы (1)


  • контрпродуктивна строка кода с repaint(), удалите ее,

  • если внутри void updateDialog() нет других строк кода, то было бы лучше, иначе pack() следует обернуть в invokeLater();

код

private void updateDialog() {
    setVisible(false);
    Point p = frame.getLocationOnScreen();
    p.x += frame.getWidth() - getWidth() - 5;
    p.y += frame.getHeight() - getHeight() - 25;
    setLocation(p);
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            pack();
            //repaint(); // useless remove this codeline
            setVisible(true);
        }
    });
}
person mKorbel    schedule 22.03.2012
comment
Просто интересно, почему вы скрываете, а затем показываете диалоговое окно, и если вызов pack() не должен происходить до setLocation, чтобы getWidth() и getHeight() возвращали обновленные значения, установленные LayoutManager? - person Guillaume Polet; 22.03.2012
comment
все, что касается Initial Thread, для меня касается двух методов pack и setVisible, кстати, у меня очень хороший опыт работы со строками кода am, предполагая, что OP a) повторно использует JDialog или b) создает новый во время выполнения - person mKorbel; 22.03.2012
comment
@Guillaume Polet теперь я вижу, что вы не знаете, как использовать URL-адрес в комментариях, нажмите на справку (слева внизу под окном комментариев), затем скопируйте 'ссылка', здесь отображаются символы '[ссылка]' и здесь url '(example.com)' - person mKorbel; 22.03.2012
comment
Хорошо, мой плохой, но я обнаружил, что ссылки работают, просто вставив URL-адрес. Мне лень писать полностью. Действительно ли считается неправильным не использовать правильные ссылки в комментариях? - person Guillaume Polet; 22.03.2012
comment
Извините, наверное, я проснулся слишком уставшим сегодня утром. Ударюсь головой об стену 3 раза за это - person Guillaume Polet; 22.03.2012