Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переместить JLabel d BorderLayout, Как добиться результата 
V
    Опции темы
Mirkes
Дата 5.2.2012, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 2
Всего: 17



Возникла не понятная мне проблема. Создал панель с BorderLayout. На север вставил JToolBar, на восток потомка JPanel по имени leg.
Код

        super(new BorderLayout());
        // Create tool bar
        gtb.setFloatable(false);
        add(gtb, BorderLayout.NORTH);
        // Create legend
        add(leg, BorderLayout.EAST);


Далее вставил эту панель во Frame и запустил.
По нажатию трех кнопок в JToolBar gtb посылаются события с идентификаторами 8, 9 и 10.
Ниже приведен код обработчика событий:

Код

    public void graphHappend(GraphEvent e) {
        switch (e.iD) {
        case 8: //8 - legend to left
            {
                remove(leg);
                repaint();
                add(leg, BorderLayout.WEST);
                repaint();
                break;
            }
        case 9: //9 - remove legend
            {
                remove(leg);
                fireGraphHappend(0);
                repaint();
                break;
            }
        case 10: //10 - legend to right
            {
                remove(leg);
                repaint();
                add(leg, BorderLayout.EAST);
                repaint();
                break;
            }
        }
    }


Проблема состоит в том, что при нажатии кнопок 8 и 10 ничего не происходит, пока не начнешь изменять размер окна.
Если нажать кнопку 9 (убрать легенду) то она исчезает. Если потом нажать кнпку 8 - поместить с левой стороны, то легенда возникает с правой, где и была. Но только до изменения размера окна. При изменении размеров окна - все приходит в норму.
Если идти через отладчик, то тоже все в порядке.
Если я праильно понимаю, то BorderLayout - компоновщик с состоянием. И до тех пор, пока что-то в серьез не изменится (например размер панели) пересчет состояния не производится. 

Внимание вопрос: как заставить BorderLayout пересчитать состояния и отобразить легенду в нужном мне в данный момент месте?

Это сообщение отредактировал(а) Mirkes - 5.2.2012, 16:02


--------------------
Mirkes
PM MAIL   Вверх
jk1
Дата 5.2.2012, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Попробуйте принудительно вызвать у контейнера repaint()


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Mirkes
Дата 5.2.2012, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 2
Всего: 17



repaint у панели, в которую я помещал легенду вызывается (см код в предыдущем сообщении). У какого контейнера вызвать  repaint?


--------------------
Mirkes
PM MAIL   Вверх
Dummy
Дата 5.2.2012, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 2
Всего: 19



Простого repaint() недостаточно в случае добавления или удаления элементов. Нужно спарить вызовы revalidate() + repaint() в панели.
Код

    public void graphHappend(GraphEvent e) {
        switch (e.iD) {
        ...
        case 8: //8 - legend to left
            {
                remove(leg);
                add(leg, BorderLayout.WEST);
                revalidate();
                repaint();
                break;
            }
    }


Вызов revalidate() нужен, чтобы сообщить компоновщику вашей панели и компоновщикам родительских контейнеров (вплоть до т. н. Validate Root), что геометрию необходимо пересчитать. Далее revalidate() вызывает validate() на компоненте Validate Root, так что геометрия пересчитывается вплоть до вашей панели.

Вызов repaint() нужен для случаев, когда после revalidate() не происходит реального изменения геометрии элементов (например, был удален последний элемент из GridLayout). 

Это сообщение отредактировал(а) Dummy - 5.2.2012, 17:40
PM MAIL   Вверх
Mirkes
Дата 5.2.2012, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 2
Всего: 17



Спасибо огромное. Выручили. Все заработало.


--------------------
Mirkes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.1234 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.