Изменить цвет фона за вкладками JTabbedPane? - PullRequest
1 голос
/ 25 марта 2020

Проблема упоминается в вопросе. Я намерен изменить цвет области, отмеченной знаком «Х» на изображении ниже, но я не знаю, как это сделать. Я пытался изменить фон JTabbedPane, но он не работал.

Я заранее извиняюсь за любые ошибки Engli sh, которые я мог сделать.

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

public class MainClass {
    public static void main(String[] args) {
        JFrame frame = new JFrame("TabbedPane Error"); // creates 2. JFrame
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.setBackground(Color.RED);
        tabbedPane.addTab("Browser",new JPanel());
        tabbedPane.addTab("Asset Notifications",new JPanel());
        frame.setSize(new Dimension(500,200));
        frame.add(tabbedPane);
        frame.setVisible(true);
    }
}

Example image

Ответы [ 2 ]

1 голос
/ 25 марта 2020

ОК, я понял это. Вам нужно указать свой собственный пользовательский интерфейс.

  1. Вам нужно расширить класс BasicTabbedPaneUI и переопределить paint.
  2. Затем вы можете установить пользовательский интерфейс:
tabbedPane.setUI(new CustomTabbedUI(Color.RED));

Этот действительно старый ответ Я выкопал был частично правильным. Очевидно, оно было неполным.


Launcher. java

package q60855752;

import javax.swing.*;

public class Launcher {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new App());
    }
}

Приложение. java

package q60855752;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;

public class App extends JPanel implements Runnable {
    public App() {
        super(new BorderLayout());

        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.setUI(new CustomTabbedUI(Color.RED));

        // Modified: https://docs.oracle.com/javase/tutorial/uiswing/components/tabbedpane.html
        addPanel(tabbedPane, "Tab 1", "Panel #1", "Does nothing", KeyEvent.VK_1, null);
        addPanel(tabbedPane, "Tab 2", "Panel #2", "Does twice as much nothing", KeyEvent.VK_2, null);
        addPanel(tabbedPane, "Tab 3", "Panel #3", "Still does nothing", KeyEvent.VK_3, null);
        addPanel(tabbedPane, "Tab 4", "Panel #4", "Panel #4 (has a preferred size of 410 x 50).", KeyEvent.VK_4, new Dimension(410, 50));

        add(tabbedPane, BorderLayout.CENTER);
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("App");
        frame.setPreferredSize(new Dimension(500, 200));
        frame.setContentPane(new App());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }

    protected void addPanel(JTabbedPane tabbedPane, String title, String content, String tooltip, int mnemonic, Dimension dimensions) {
        JComponent panel = createPanel(title);
        if (dimensions != null) panel.setPreferredSize(dimensions);
        tabbedPane.addTab(content, null, panel, tooltip);
        tabbedPane.setMnemonicAt(tabbedPane.getTabCount() - 1, mnemonic);
    }

    protected JComponent createPanel(String text) {
        JPanel panel = new JPanel(false);
        JLabel filler = new JLabel(text);
        filler.setHorizontalAlignment(JLabel.CENTER);
        panel.setLayout(new GridLayout(1, 1));
        panel.add(filler);
        return panel;
    }
}

CustomTabbedUI. java

package q60855752;

import javax.swing.*;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
import java.awt.*;

public class CustomTabbedUI extends BasicTabbedPaneUI {
    private Color backgroundColor;

    public CustomTabbedUI(Color backgroundColor) {
        super();
        this.backgroundColor = backgroundColor;
    }

    public void setBackgroundColor(Color backgroundColor) {
        this.backgroundColor = backgroundColor;
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        Rectangle bounds = tabPane.getBounds();
        g.setColor(this.backgroundColor);
        g.fillRect(0, 0, bounds.width, bounds.height);

        super.paint(g, c); // Call parent...
    }
}
0 голосов
/ 26 марта 2020

Я намереваюсь изменить цвет области, отмеченной 'X'

Единственный "X", который я вижу, находится в строке заголовка рамки. Вы не можете изменить это с помощью Swing.

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

frame.getContentPane().setBackground(Color.RED) 
frame.add(tabbedPane);
...