Возникли проблемы с применением цвета фона к JTabbedPane - PullRequest
0 голосов
/ 30 августа 2018

Я пытался изменить цвет фона вкладки в JTabbedPane. Я прочитал онлайн на java-документации, а также на форумах, что они должны быть непрозрачными и иметь значение false и использовать tabpane.setBackgroundAt(index, color) для изменения фона. Я не могу заставить его работать, хотя. Моя вкладка состоит из JPanel (установите opaque в false) с JLabel (который будет именем файла) и JButton (X, чтобы закрыть вкладку). Для метки, кнопки и панели установлено непрозрачное значение false, но независимо от того, когда я пытаюсь установить цвет фона, он просто остается цветом по умолчанию.

Это мой код для моей вкладки, с которой я работаю:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

public class TextEdit extends JTabbedPane {
    public TextEdit() {
        // On startup, display a blank tabbed pane
        AddTab("Untitled");
    }

    protected void AddTab(String fileName) {
        /* This will be the panel that displays the
         * textarea
         */
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(0,1));

        /* Textarea where the user will be able
         * to type content into
         */
        JTextArea ta = new JTextArea();
        ta.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));

        /* Scrollpane that allows us to scroll
         * if content in the text area gets too
         * large
         * 
         */
        JScrollPane sp = new JScrollPane(ta);

        /* Line numbering
         * In the future I will turn this on and off
         * based on user preferences. This line will
         * work to disable line numbering:
         * sp.setRowHeaderView(null);
         */
        TextLineNumber tln = new TextLineNumber(ta);
        sp.setRowHeaderView(tln);

        /*
         * Add scrollpane to the panel
         */
        panel.add(sp);

        /* Now we configure the tab panel
         * that displays the filename with an 'X'
         * that will enable us to close the file (pane)
         */
        JPanel tabPanel = new JPanel();
        tabPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 2));
        tabPanel.setOpaque(false);

        // Label for the filename
        JLabel label = new JLabel(fileName);
        label.setBorder(new EmptyBorder(0,0,0,0));

        // Button for the close button
        JButton button = new JButton("X");
        button.setBorder(new EmptyBorder(0,0,0,0));
        button.setBorderPainted(false);
        button.setOpaque(false);
        button.setContentAreaFilled(false);
        // On hover, change the color that way we know it's a button
        button.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent e) {
                button.setForeground(Color.RED);
            }
            public void mouseExited(java.awt.event.MouseEvent e) {
                button.setForeground(Color.BLACK);
            }
        });

        tabPanel.add(label);
        tabPanel.add(button);

        panel.setPreferredSize(new Dimension(1000, 500));
        this.addTab(fileName, panel);

        int index = this.getSelectedIndex();
        this.setTabComponentAt(index, tabPanel);
        this.setBackgroundAt(index, Color.GREEN);
    }
}

Есть предложения? Я знаю, что индекс правильный, потому что он работает, когда я setTabComponentAt(index,tabPanel). Я думал, что это могло вызвать ошибки, но это не так.

UPDATE: Итак, я создал вторую вкладку и заметил, что цвет фона меняется, если вкладка не активна. Я просто не мог видеть это с одной вкладкой. Есть ли способ изменить цвет активной вкладки? Моя цель состоит в том, чтобы цвет активной вкладки отличался от цвета неактивных вкладок.

...