LINUX.ORG.RU

Как сделать, чтобы JComboBox перерисовывался?

 , , инвалид


0

1

Проблема: написал рендерер для JComboBox, и теперь при выборе элемента - подставляется пустота.

Т.е. элемент выбрался, но не отображается.

Если щелкнуть на что-нибудь с фокусом, например, поле ввода или чекбокс, все мигом перерисовывается.

Если двигать окном и шелкать мышкой на неактивные элементы - тоже не отображается.

Пробовал ставить actionListener(revalidate,repaint), и на любой action, и на любой action айтемов, делал fireContentsChanged(-1,-1) для модели на каждый чих, и даже делал таймер, который каждые 500мс посылает сабжевые репэйнты. Не помогает! Помогают только щелчки на фокусирующиеся элементы.

Посоветуйте, что это может быть? Вам знакомы симптомы?

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

★★★★☆

рендерер на основе какого класса сделан? Какой-либо стандартный, типа JLabel или на основе примитивного Component?

no-dashi ★★★★★
()

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

import javax.swing.*;
import java.awt.*;
import javax.swing.plaf.*;
import javax.swing.plaf.basic.*;

public class MyCBUI extends BasicComboBoxUI {
	public MyCBUI() { super(); }
	public void paint(Graphics g, JComponent c) {
		JComboBox cb = (JComboBox)c;
		super.paint(g,cb);
		Object item = cb.getSelectedItem();
		Component renderer = cb.getRenderer().getListCellRendererComponent(null, item, cb.getSelectedIndex(), true, true);
		renderer.setBounds(0,0,cb.getBounds().width,cb.getBounds().height);
		renderer.paint(g);
	}
}

Ну или сделай какой-нибудь прокси-UI над тем, который вернёт тебе компонент.

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

Привет.

Спасибо за ответ.

У меня IDE на основе IntelliJ IDEA, рендереры стандартные оттуда. Код их, впрочем, довольно прост.

Твой совет, к сожалению, не помог.

Поэтому я взял master branch от новой версии Идеи и утащил оттуда тамошний комбобокс со всеми зависимостями (заодним выдрав оттуда здоровенный кусок Платформы, который обозвал com.intellij.backport12 :-)

Так все заработало

Отвратительное решение, но ничего другого пока не вышло

stevejobs ★★★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.