Установите цвет фона для JTabbedPane

Я использую Nimbus Look and feel. Мне нужно изменить цвет фона и цвет переднего плана вкладки в JTabbedPane, но цвет не установлен в JTabbedPane. Я пробовал методы setForeground (), setForegroundAt (), setBackground () и setBackgroundAt (), но они не работают. Это мой код


public class TabbedPaneDemo extends JFrame
{
    TabbedPaneDemo()
    {
        try
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        }
        catch(Exception ex) {}

setLayout(new BorderLayout()); setBounds(100, 100, 800, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JTabbedPane jt = new JTabbedPane(); jt.addTab("Tab1", new JPanel()); jt.addTab("Tab2", new JPanel()); jt.addTab("Tab3", new JPanel()); jt.addTab("Tab4", new JPanel()); for( int i = 0; i < jt.getComponentCount(); i++) { jt.setForegroundAt(i, Color.RED); jt.setBackgroundAt(i, Color.BLACK); } add(jt); setVisible(true); } public static void main(String args[]) { new TabbedPaneDemo(); }

}


person Ram    schedule 15.03.2010    source источник


Ответы (6)


Вы можете сделать несколько разных вещей в зависимости от того, насколько вы хотите контролировать точный цвет. Самый простой способ - изменить некоторые свойства в UIManager, чтобы изменить цвета, из которых Nimbus получает другие цвета. Я немного поигрался с вашим кодом и обнаружил, что если я помещу следующий код после вызова UIManager.setLookAndFeel (), он будет примерно соответствовать красному на черном, который вы пытались сделать в своем примере:

     UIManager.put("nimbusBase", new ColorUIResource(0, 0, 0));
     UIManager.put("textForeground", new ColorUIResource(255, 0, 0));

Я оставлю это на ваше усмотрение. Для получения дополнительной информации для экспериментов есть хорошая статья о настройке Nimbus здесь. Обязательно посмотрите его ссылку под названием «Список свойств Nimbus UIDefaults». Помимо простого преобразования цветов во что-то похожее на то, что вы хотите, вам придется начать делать беспорядочные вещи, например, реализовывать классы Painter, которые выполняют пользовательское рисование.

person Rob Heiser    schedule 24.03.2010

Ненавижу сообщать вам об этом, но вам будет очень сложно изменить цвета переднего плана и фона. В отличие от многих основных компонентов (JTextField, JLabel и т. Д.), JTabbedPane игнорирует цвета переднего плана и фона при настройке для рисования. Вместо этого он позволяет делегату пользовательского интерфейса (как определено текущим Look and Feel) выбирать цвета.

Некоторые Look and Feels допускают использование цветовых тем (на ум приходит Substance), но у Nimbus, похоже, есть те значения цвета жестко закодированы в делегатах рисования.

Скорее всего, вам понадобится реализовать собственный делегат пользовательского интерфейса на основе Nimbus. Дополнительную информацию см. здесь. Это будет большой проблемой, поэтому спросите себя, насколько вы хотите изменить эти цвета.

Наконец, если кто-нибудь скажет вам просто создать подкласс JTabbedPane и установить цвета в вашем собственном методе paintComponent, игнорируйте это. Затем вы становитесь ответственным за рисование всего компонента и теряете любые визуальные атрибуты, подобные Nimbus.

person Jason Nichols    schedule 23.03.2010
comment
Я второй Джейсон - я потратил дни, пытаясь заставить JTabbedPane в Nimbus показывать вкладки немного темнее (потому что они становятся почти белыми, когда вы указываете светлые базовые цвета). Крайне неприятно, что вам понадобится степень во внутреннем устройстве Nimbus ... - person Philippp; 21.09.2011

JTabbedPane работает, когда вы добавляете к нему компоненты, например, добавляете 5 панелей JPanel, и они будут иметь вкладки.

person Halo    schedule 15.03.2010
comment
Я добавил панели в JTabbedPane. Это мой код JTabbedPane jt = new JTabbedPane (); jt.addTab (Tab1, новый JPanel ()); jt.addTab (Tab2, новый JPanel ()); jt.addTab (Tab3, новый JPanel ()); jt.addTab (Tab4, новый JPanel ()); jt.setForeground (Color.RED); jt.setBackground (Color.BLACK); jf.add (jt); // добавляем JTabbedPane в JFrame - person Ram; 15.03.2010

Извините за мой английский.

Пробовал решить эту проблему 2 дня .. Есть "обходной путь".

Требуется установить компонент вкладки. А затем установите цвет для этого компонента.

/*
  ...
  Setting LAF Nimbus
  ...
*/

JTabbedPane tp = new JTabbedPane();

/*
   ...
   add tabs in TabbedPane
   ...
*/

тогда для указанных вкладок нужно сделать:

        JLabel title = new JLabel(tp.getTitleAt(tabIndex));
        title.setForeground(Color.RED);
        tp.setTabComponentAt(tabIndex, title);

МОЙ БОГ!! это работает!

person Serge Maslyakov    schedule 20.01.2012
comment
+1 Хороший, но учтите, что он не работает с цветом фона. - person DNA; 27.03.2012

Если вы хотите изменить фактическое содержимое, есть два полезных метода панели с вкладками: setForegroundAt и setBackgroundAt. Вы можете просто просмотреть все вкладки и вызвать их:

for (int i = 0; i < pane.getTabCount(); i++) {
    pane.setForegroundAt(i, foregroundColor);
    pane.setBackgroundAt(i, backgroundColor);
}

Вы также можете использовать getComponentAt аналогичным образом:

for (int i = 0; i < pane.getTabCount(); i++) {
    pane.getComponentAt(i).setForeground(foregroundColor);
    pane.getComponentAt(i).setBackground(backgroundColor);
}

Последний подход более гибкий - позже вы сможете делать более сложные вещи со всеми компонентами, используя подобный код.

person Tikhon Jelvis    schedule 15.03.2010

На самом деле неправда

new JTabbedPane().setUI(new YourUI());

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

public class YourUI extends BasicTabbedPaneUI{

.....

private class ScrollableTabPanel extends JPanel implements UIResource {
public ScrollableTabPanel() {
    setLayout(null);
}

public void paintComponent(Graphics g) {

super.paintComponent(g);

g.setColor(Color.red);
g.fillRect(tabPane.getBounds());            

        }
    }

....

}

Ян Кайтхамл

Вот как это должно выглядеть (не обращайте внимания на вкладки QuadSpline и закрывающие панели, которые являются еще одним дополнением моей реализации пользовательского интерфейса), моя репутация здесь отсутствует, поэтому есть ссылка на изображение

http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash3/166028_2974620064454_896181702_n.jpg

person jan.cajhtaml    schedule 30.06.2012
comment
Для тех, кто задается вопросом, как это реализовать, я добился этого здесь: stackoverflow.com/a/60856384/1762224 - person Mr. Polywhirl; 25.03.2020