Могу ли я изменить цвет фона всплывающего окна JComboBox существующего объекта?

У меня есть существующий объект JComboBox. Я могу изменить многие из его свойств, используя внутренние методы. Однако я не смог найти аналогичные методы для настройки внешнего вида всплывающего окна, в частности, цвета фона всплывающего окна. У меня есть существующий объект, поэтому я хочу использовать его существующие методы/свойства, а не писать специальный класс. Это возможно?

Примечание: этот вопрос НЕ совпадает со связанным вопросом выше (в котором неверно указано, что на этот вопрос уже есть ответ): этот вопрос задавался о цвете цвета выбранного элемента. (в поле редактирования выпадающего списка); Я спрашиваю о цвете bgcolor всплывающего окна.


person Yair Altman    schedule 12.11.2010    source источник
comment
Мой вопрос НЕ совпадает со связанным вопросом выше (в котором неправильно указано, что на этот вопрос уже есть ответ): этот вопрос задавался цветом выбранного элемента (в поле редактирования поля со списком); Я спрашиваю о цвете bgcolor всплывающего окна.   -  person Yair Altman    schedule 13.09.2016
comment
Другой вопрос [1] был опубликован после моего - его не существовало, когда я разместил свой. Что касается ответа, хотя ответ, который я принял, прямо не отвечает на мой вопрос (а скорее на другой вопрос), он указывает на явно правильный (и, предположительно, единственный) способ решения проблемы, а именно на создание специального класс рендеринга ячеек. Никто не дал лучшего ответа за месяц с тех пор, как я опубликовал свой вопрос, поэтому я решил, что он достаточно близок, и принял ответ. [1]: stackoverflow.com/questions/4412902/   -  person Yair Altman    schedule 13.09.2016


Ответы (3)


Как сказал eugener, использование пользовательского ListCellRenderer определенно является правильным способом сделать это. Вам просто нужно создать класс, который расширяет DefaultListCellRenderer. Этот рендерер по умолчанию расширяет JLabel, поэтому его проще понять! Вам просто нужно позвонить setBackground().

JComboBox combo = new JComboBox(new String[] { "A", "B", "C", "D" });
combo.setRenderer(new DefaultListCellRenderer() {
    public void paint(Graphics g) {
        setBackground(Color.YELLOW);
        setForeground(Color.RED);
        super.paint(g);
    }
});
person BoffinBrain    schedule 10.12.2010
comment
Как я уже отмечал выше, я хочу избежать создания собственного класса. Однако, поскольку это пока лучший ответ, я его принял - может быть, действительно нет другого способа сделать то, что мне нужно. Спасибо всем за усилия. - person Yair Altman; 13.12.2010
comment
Я рад, что это помогает. В некотором смысле, использование анонимного класса, как я сделал, устраняет необходимость создания нового класса Java, на что вы частично намекаете, но на самом деле нет необходимости беспокоиться о создании новых классов вообще< /я>. Если вам нужны специальные функции, создайте для этого собственный класс, чтобы его можно было использовать повторно. Вот как работает ООП! :) - person BoffinBrain; 15.12.2010

Вам нужно будет создать собственный рендерер comboxbox. Дополнительная информация находится здесь: http://download.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer

person Eugene Ryzhikov    schedule 12.11.2010
comment
Как я уже отмечал выше, я хочу избежать создания собственного класса. Есть ли способ получить доступ к всплывающему компоненту, используя существующие свойства/методы? - person Yair Altman; 14.11.2010
comment
Это не поможет, потому что рендерер по умолчанию все равно будет рендерить поверх него. - person Eugene Ryzhikov; 15.11.2010

Ты пытался:

comboBox.setBackground(color);
person dogbane    schedule 12.11.2010
comment
Нет, это сам фон комбо, а не всплывающее окно. - person Geoffrey Zheng; 12.11.2010