Свинг-покраска

У меня есть некоторые проблемы с живописью на качелях.

Мой следующий пользовательский интерфейс (посмотрите на следующую картинку) имеет JTextField с левой стороны, у которого есть возможность показывать подсказки автозаполнения. С правой стороны должны отображаться элементы, выбранные из текстового поля. Эти элементы содержатся в JPanel, который использует FlowLayout(FlowLayout.LEFT) в качестве менеджера компоновки.

мой пользовательский интерфейс

Теперь при выборе некоторых элементов из текстового поля, которые будут добавлены в блок-схему, элементы не будут прокрашены. (Показано на следующем рисунке) Новые элементы не будут окрашены

Теперь у меня есть две возможности показать эти незакрашенные элементы.

Во-первых: после изменения размера JFrame будут показаны элементы.

Во-вторых: выбор достаточного количества элементов, чтобы FlowLayout переносил строку. После разрыва строки будут показаны все элементы. При выборе дополнительных элементов они не будут отображаться до следующего разрыва строки.

Элементы после разрыва строки FlowLayout:

Элементы после разрыва строки FlowLayout

Что я могу сделать?


person endian    schedule 13.02.2013    source источник
comment
Попробуйте вызвать: revalidate() на панели FlowLayout после добавления элемента. Это заставит менеджер компоновки заново компоновать свои компоненты. Я не могу предложить больше, не видя кода. Проблема также может заключаться в методе покраски зеленых компонентов.   -  person David Lavender    schedule 13.02.2013
comment
Если revalidate() не работает, попробуйте добавить repaint().   -  person alan.sambol    schedule 13.02.2013
comment
Я уже пробовал следующие магические методы свинга: validate(), revalidate(), repaint(), updateUI().   -  person endian    schedule 13.02.2013
comment
вы пробовали проверить() на внешней панели JPanel с помощью SwingUtilities.invokeLater()? - кстати. это одна из причин, по которой я не люблю Swing!   -  person michael_s    schedule 13.02.2013
comment
@michael_s: да, но не сработает   -  person endian    schedule 13.02.2013
comment
Я предполагаю, что проблема должна быть в методе рисования зеленого ящика. Это пользовательский компонент? Если это так, опубликуйте его метод paint/paintComponent. Судя по скринам, менеджер компоновки вроде выделяет для него место, но элемент ничего не отрисовывает.   -  person David Lavender    schedule 13.02.2013
comment
@MrSpoon: зеленое поле — это JXLabel (который является классом из библиотеки swingx и расширяет JLabel). Классы пользовательского интерфейса Swingx имеют возможность прикрепить фоновый рисовальщик (ссылка).   -  person endian    schedule 13.02.2013
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE. И ре. JXLabel. Выделите его для SSCCE и используйте вместо него JLabel. Я предполагаю, что вы сможете заставить его потерпеть неудачу таким же образом, используя чистый J2SE.   -  person Andrew Thompson    schedule 13.02.2013
comment
Собирался сказать, попробуйте поменять JXLabel на простой JLabel. Так же, как быстрая проверка здравомыслия. Может быть ошибка JXLabel.   -  person David Lavender    schedule 13.02.2013
comment
@MrSpoon: я не думаю, что это ошибка JXLabel, потому что я использую тот же класс в другом представлении, и проблем нет.   -  person endian    schedule 13.02.2013
comment
Что это за элементы подсказки?   -  person Ömer Faruk Almalı    schedule 13.02.2013
comment
Вызовите pack() на JFrame, чтобы он соблюдал новый размер панели (после добавления дополнительных вещей)   -  person David Kroukamp    schedule 13.02.2013
comment
@ÖmerFarukAlmalı: JXLabels   -  person endian    schedule 13.02.2013
comment
@DavidKroukamp: но pack() изменяет размер JFrame   -  person endian    schedule 13.02.2013
comment
@DavidKroukamp: Пожалуйста, прочитайте вопрос. У меня нет проблем с размерами. Размер для зеленых элементов будет зарезервирован. Элементы черные/не окрашенные, вот в чем проблема.   -  person endian    schedule 13.02.2013
comment
Понятно... если вы переопределили какой-либо метод рисования, обязательно ли вы вызвали его super.XXX реализацию? То есть, если мы не вызовем super.paintComponent(..) (в качестве первого вызова) в переопределенном paintComponent из JComponent, могут возникнуть визуальные артефакты... Пожалуйста, просмотрите публикацию SSCCE прямо сейчас, мы предполагаем, что могут быть другие факторы, которые будут отображаться только в вашем коде.   -  person David Kroukamp    schedule 13.02.2013
comment
@DavidKroukamp: я не отменяю методы рисования.   -  person endian    schedule 13.02.2013


Ответы (1)


Обмен FlowLayout на пользовательский WrapLayout устранил проблему. Кажется, это была проблема макета.

person endian    schedule 18.02.2013