Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: GUI и Java FX приложения > Переместить JLabel d BorderLayout |
Автор: Mirkes 5.2.2012, 16:01 | ||||
Возникла не понятная мне проблема. Создал панель с BorderLayout. На север вставил JToolBar, на восток потомка JPanel по имени leg.
Далее вставил эту панель во Frame и запустил. По нажатию трех кнопок в JToolBar gtb посылаются события с идентификаторами 8, 9 и 10. Ниже приведен код обработчика событий:
Проблема состоит в том, что при нажатии кнопок 8 и 10 ничего не происходит, пока не начнешь изменять размер окна. Если нажать кнопку 9 (убрать легенду) то она исчезает. Если потом нажать кнпку 8 - поместить с левой стороны, то легенда возникает с правой, где и была. Но только до изменения размера окна. При изменении размеров окна - все приходит в норму. Если идти через отладчик, то тоже все в порядке. Если я праильно понимаю, то BorderLayout - компоновщик с состоянием. И до тех пор, пока что-то в серьез не изменится (например размер панели) пересчет состояния не производится. Внимание вопрос: как заставить BorderLayout пересчитать состояния и отобразить легенду в нужном мне в данный момент месте? |
Автор: jk1 5.2.2012, 16:36 |
Попробуйте принудительно вызвать у контейнера repaint() |
Автор: Mirkes 5.2.2012, 17:35 |
repaint у панели, в которую я помещал легенду вызывается (см код в предыдущем сообщении). У какого контейнера вызвать repaint? |
Автор: Dummy 5.2.2012, 17:39 | ||
Простого repaint() недостаточно в случае добавления или удаления элементов. Нужно спарить вызовы revalidate() + repaint() в панели.
Вызов revalidate() нужен, чтобы сообщить компоновщику вашей панели и компоновщикам родительских контейнеров (вплоть до т. н. Validate Root), что геометрию необходимо пересчитать. Далее revalidate() вызывает validate() на компоненте Validate Root, так что геометрия пересчитывается вплоть до вашей панели. Вызов repaint() нужен для случаев, когда после revalidate() не происходит реального изменения геометрии элементов (например, был удален последний элемент из GridLayout). |
Автор: Mirkes 5.2.2012, 17:45 |
Спасибо огромное. Выручили. Все заработало. |