Установите цвет фона для JTabbedPane - PullRequest
3 голосов
/ 15 марта 2010

Я использую Nimbus. Мне нужно изменить цвет фона и цвет переднего плана вкладки в 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) {}</p>

<code>    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();
}

}

Ответы [ 6 ]

9 голосов
/ 25 марта 2010

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

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

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

3 голосов
/ 23 марта 2010

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

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

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

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

2 голосов
/ 20 января 2012

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

Я пытался решить эту проблему 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);

OMG !! его работа!

2 голосов
/ 15 марта 2010

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

1 голос
/ 30 июня 2012

На самом деле не соответствует действительности

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

1 голос
/ 15 марта 2010

Если вы хотите изменить фактическое содержимое, существует два полезных метода панели вкладок: 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);
}

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

...