проблема обновления Java качели - PullRequest
3 голосов
/ 08 июля 2010

У меня есть класс Frame (расширяет JInternalFrame).Внутри класса я создаю экземпляр JPanel и инициализирую setVisisble(false).После того, как пользователь щелкает по кнопке в кадре и выполняет некоторую обработку, я вызываю метод внутри JPanel, чтобы обновить одну из его меток.Затем я делаю setVisible(true) на JPanel.

Однако JPanel не "обновляется" правильно после того, как я вызываю setText() на одной из его меток.После обработки и установки JPanel в видимое состояние (и я подтвердил, что правильные данные есть и т. Д.), JPanel по-прежнему находится в своей инициализированной форме.setText() на JPanel внутри фрейма фактически обновляет Panel?

В основном мне интересно: если вы обновите текст метки внутри компонента Swing, который вложен в JFrame, должно ли обновление бытьвидно?Что нужно сделать, чтобы обновить, если нет?

Ответы [ 5 ]

2 голосов
/ 09 июля 2010

Спасибо за все ваши ответы. Тот факт, что я не опубликовал какой-либо код, сделал невозможным выяснение проблемы (теперь я понимаю). Этот класс довольно большой, и, поскольку я понятия не имел, в чем заключается проблема, я просто дал обзор того, что мне показалось уместным.

В любом случае, после долгих копаний вот что пошло не так в случае, если кто-нибудь столкнется с чем-то подобным:

Размер JLabels, который я создаю внутри JPanel, измеряется с использованием метода setBounds(), которому я предоставляю x, y, height и width. Эти вызовы setBounds() выполнялись изначально, когда инициализировался JPanel. Кроме того, параметры height, width извлекались из метки динамически (с использованием getMinimumHeight() и т. Д., Поэтому размер метки изменяется в зависимости от количества текста в ней). Проблема заключалась в том, что некоторые метки инициализировались текстом без , в результате чего ширина была равна 0. Поэтому позже, когда я позвонил setText(), он работал правильно, за исключением того факта, что ширина была 0 ( текст был там, я просто не мог его увидеть!).

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

2 голосов
/ 08 июля 2010

Почему вы даже создаете JPanel раньше времени? почему бы не создать его заново, с правильным текстом, в первый раз?

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

myPanel.validate()

что нужно для этой дополнительной панели? возможно вы должны использовать диалог; или просто добавив JPanel к существующему фрейму.

2 голосов
/ 08 июля 2010

Попробуйте это:

myPanel.invalidate()

Если это не сработает, то, возможно, попробуйте опубликовать некоторый код.

1 голос
/ 08 июля 2010

Вы не даете нам много, чтобы продолжать.Вот несколько общих вещей, которые нужно проверить.

Переопределили ли вы какой-либо из методов рисования JInternalFrame?Если это так, не забудьте назвать версии базового класса, когда вы закончите рисование.Версии базового класса обрабатывают такие вещи, как границы вокруг панелей и отсечение из других объектов графического интерфейса.

Вы уверены, что переменная метки, которая получает ваш вызов setText (), та же, что вы добавили в JPanel?

0 голосов
/ 09 июля 2010

Для того, чтобы изменения ваших объектов в памяти были полностью и надежно применены к GUI, вам необходимо вызвать методы validate () и repaint () соответствующих объектов.validate () выполняет своего рода операцию коммита для последних изменений.Поэтому, если вы измените текст метки, вы не сможете увидеть это изменение, даже если вызовете repaint ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...