2013-03-14 1 views
1

Мне нужно заставить мою программу проверять и перерисовывать мой gui (или его часть), когда он добавляет к нему новый компонент. Должно быть абсолютно ничего не сделано, пока компонент не будет нарисован на экране, тогда код может продолжаться.Мгновенная перекраска и проверка

Я создаю слоистую структуру JPanel. Серия JPanels, каждая из которых содержит серию JPanels, каждая из которых содержит ряд JPanels.

Как я создаю JPan уровня 3-го уровня, мне нужно взять данные с JPan уровня 1 уровня, которые еще не нарисованы. Это заставляет их возвращать неверные данные и испортить всю настройку.

1-й уровень JPanels только окрашивается после того, как мастер для цикла (один идет через 1-й уровень JPanels) завершен.

Как я могу заставить свою программу нарисовать ее, как только она будет создана и добавлена ​​к ее родительскому? Все здесь сделано внутри EDT, я проверил. Перерисовать и проверять не удалось.

EDIT: Хорошо, я использовал решение Робинса.

Тем не менее, есть способ принудительно обновлять мгновенные обновления графического интерфейса, как только будет запущена строка в коде (oposed to aiting for loop to finins и подобные вещи). Было бы намного легче отладить некоторые вещи, если бы это было возможно. Даже если insta-update означает приостановку всех остальных потоков.

ответ

3

Как я создаю JPan уровня 3-го уровня, мне нужно взять данные с 1-го уровня JPanels, которые еще не нарисованы. Это заставляет их возвращать неверные данные и испортить всю настройку.

Я бы сначала предложил изменить эту установку на что-то более безопасное. Чтобы полагаться на порядок окраски элементов вашего интерфейса, это хороший источник неприятных проблем.

JPanels 1-го уровня только покраситься после копиров цикла (один , который идет корыто JPanels первого уровня) будет завершена.

Как я могу заставить мою программу нарисовать ее, как только она будет создана, и добавлен к ее родительскому? Все здесь сделано внутри EDT, я проверил. Перерисовать и проверить не работает вообще.

Это не работает, потому что вы блокируете EDT. Вызов repaint и/или validate фактически не вызывает перерисовку. Вместо этого он планирует один. Вы можете попытаться разбить свою мастер-петлю в нескольких отдельных Runnable, которые вы планируете каждый раз на EDT. Это может позволить запланированному Runnable вызовом repaint для проскакивания между ними. Однако для этого нет никакой гарантии.

1

У вас должна быть модель данных графического интерфейса пользователя, которая содержит информацию, которую вы хотите разместить на панелях.

Вы должны генерировать информацию, а затем создавать свои компоненты графического интерфейса.