Изменить цвет фона выбранной вкладки в JTabbedPane - PullRequest
0 голосов
/ 13 января 2020

У меня есть JTabbedPane с двумя "вкладками". Я хочу попробовать выделить выбранную вкладку другим цветом.
Для этого я использую setBackgroundAt , но это не меняет GUI.
Может кто-нибудь пожалуйста скажите мне, почему это так, или как я правильно это делаю?

public JTabbedPane getTabbedPane() {
    if (this.tabbedPane == null) {
        this.tabbedPane = new JTabbedPane();

        this.tabbedPane.addTab("Tab 1", new JPanel());
        this.tabbedPane.addTab("Tab 2", new JPanel());

        this.tabbedPane.addChangeListener(e -> {
            for(int i = 0; i < tabbedPane.getTabCount(); i++){
                tabbedPane.setBackgroundAt(i, Color.RED);
            }

            tabbedPane.setBackgroundAt(tabbedPane.getSelectedIndex(), Color.GREEN);
            tabbedPane.repaint();
        });
    }
    return this.tabbedPane;
}

Результат выглядит так:

Result

1 Ответ

1 голос
/ 13 января 2020

JTabbedPane позволяет только изменить фон невыбранной вкладки. Чтобы изменить цвет выбранной вкладки, необходимо временно заменить свойство «TabbedPane.selected» UIManager.

Пример:

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

/**
 * <code>TabbedPaneDemo</code>.
 */
public class TabbedPaneDemo {

    private JTabbedPane tabbedPane;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new TabbedPaneDemo()::startUp);
    }

    private void startUp() {
        JFrame frm = new JFrame("Tab demo");
        frm.add(getTabbedPane());
        frm.setSize(500, 200);
        frm.setLocationRelativeTo(null);
        frm.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        frm.setVisible(true);
    }

    private JTabbedPane getTabbedPane() {
        if (this.tabbedPane == null) {
            // UI hack - temporary replace selection color
            Color old = UIManager.getColor("TabbedPane.selected");
            UIManager.put("TabbedPane.selected", Color.GREEN);
            this.tabbedPane = new JTabbedPane();
            UIManager.put("TabbedPane.selected", old);

            this.tabbedPane.addTab("Tab 1", new JPanel());
            this.tabbedPane.addTab("Tab 2", new JPanel());
        }
        updateTabs();
        return this.tabbedPane;
    }

    private void updateTabs() {
        for (int i = 0; i < tabbedPane.getTabCount(); i++) {
            tabbedPane.setBackgroundAt(i, Color.RED);
        }
    }
}

Этот хак имеет один недостаток: вы больше не можете изменять фон выделения. Таким образом, каждая выбранная вкладка на панели вкладок будет иметь зеленый фон.

...