Как изменить цвет фона JTabbedPane во время выполнения?

Я нашел множество примеров, которые меняют цвет фона JTabbedPane, используя либо setBackgroundAt(), либо UIManager.put("JTabbedPane...").

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

Я не смог сделать эту работу, используя вышеуказанные методы.

Есть идеи?

PS: я могу изменить цвет переднего плана, используя setForgroundAt(), но не фон по какой-то причине


person Shervin Asgari    schedule 26.10.2012    source источник
comment
работает, уверен, что UIManager имеет больше ключей для JTabeedPane, а не хороший JComponent для CustomWhatever, потому что большинство методов защищены извне (также реализованные методы), для лучшей помощи скорее опубликуйте SSCCE,   -  person mKorbel    schedule 26.10.2012
comment
моя точка зрения   -  person mKorbel    schedule 26.10.2012
comment
Интересно, почему цвет переднего плана можно изменить, но не фон, без реализации моей собственной версии с вкладками   -  person Shervin Asgari    schedule 26.10.2012
comment
не знаю, что случилось, опубликуйте SSCCE   -  person mKorbel    schedule 26.10.2012
comment
Как правило, когда вы можете установить передний план, но не фон, вам нужно проверить свойство opaque. Если это ложь, то фон не рисуется, и вы видите фон родителя.   -  person Devon_C_Miller    schedule 26.10.2012


Ответы (3)


LAF могут игнорировать пользовательские настройки некоторых (только визуальных? не знаю) свойств JComponent, как описано fi:

Это зависит от внешнего вида, чтобы уважать это свойство, некоторые могут игнорировать его.

Таким образом, результат сильно зависит от LAF (Worksforme в Metal и Motif, а не в Nimbus/Win). Нет простого и безопасного способа (за исключением настройки делегата пользовательского интерфейса, что не является реальным вариантом)

person kleopatra    schedule 26.10.2012
comment
Одинаково для всех JComponent. - person trashgod; 26.10.2012
comment
@trashgod, спасибо за предупреждение, я слишком сосредоточился на этом конкретном контексте ;-) - person kleopatra; 27.10.2012
comment
Так что в принципе бросьте это, я думаю. Думаю, я могу только изменить цвет переднего плана и жить с ним, не меняя внешний вид. - person Shervin Asgari; 30.10.2012

Переопределите paintComponent и измените там цвет.

@Override
public void paintComponent(Graphics g) {
    g.setColor(new Color(color));
    g.fillRect(0, 0, getWidth(), getHeight());
person Roman C    schedule 26.10.2012
comment
Я не думаю, что это работает для изменения цвета фона во время выполнения так, как я хочу. Это меняет его только один раз. Мне нужно изменить его дважды, используя actionlistener - person Shervin Asgari; 26.10.2012
comment
@Shervin просто заключает эти вызовы методов в оператор if, где условие проверяет значение вашего флажка. В вашем прослушивателе действий просто вызовите repaint() на JTabbedPane - person Guillaume Polet; 26.10.2012
comment
@Shervin Определенно, вы меняете цвет где-то в действии, и, как сказал @GuillaumePolet, позвоните repaint, чтобы изменения вступили в силу. - person Roman C; 26.10.2012

Попробуйте выполнить следующие действия после установки цветов фона/переднего плана для каждой панели вкладок. Это должно сделать вкладки вверху того же цвета, что и панели в JTabbedPane (myTabs). Это работает для меня с Nimbus.

for (int c = 0; c < myTabs.getComponentCount(); ++c)
{
  myTabs.setBackgroundAt(c, myTabs.getComponentAt(c).getBackground());
  myTabs.setForegroundAt(c, myTabs.getComponentAt(c).getForeground());
}

myTabs.setOpaque(true);
myTabs.setUI(new BasicTabbedPaneUI()); 
person ttpa    schedule 28.05.2013