JTabbedPane настроить внешний вид вкладки - PullRequest
8 голосов
/ 22 октября 2011

Я хочу настроить внешний вид вкладок в JTabbedPane.
Я хочу начать с самого простого и простого поведения: без границ, сплошной цвет.
Проблема заключается в том, что по-прежнему сохраняется нездоровая атмосфера: небольшая граница вкладок перекрывается.

enter image description here

Вы видите, что поскольку выбрана вторая вкладка, она "выдвинута на передний план". Это достигается небольшим перекрытием полей. Есть ли (не хитрый) способ отключить это поведение?

простой, проверяемый (просто исправить импорт) код:

public class TabbedPane_LookStudy extends JFrame{

public static void main(String [] args) throws UnsupportedLookAndFeelException {
    UIManager.setLookAndFeel(new NimbusLookAndFeel());
    new TabbedPane_LookStudy().setVisible(true);
}

public TabbedPane_LookStudy() {
    JTabbedPane tp = new JTabbedPane();
    tp.setUI(new MyTabbedPaneUI());
    add(tp);

    tp.addTab("first",new JPanel());
    tp.addTab("second", new JPanel());
    tp.addTab("third", new JPanel());

    setPreferredSize(new Dimension(180,100));
    pack();
}

public static class MyTabbedPaneUI extends javax.swing.plaf.basic.BasicTabbedPaneUI {

    @Override
    protected void paintTab(Graphics g, int tabPlacement, Rectangle[] rects, 
               int tabIndex, Rectangle iconRect, Rectangle textRect) {
        Color savedColor = g.getColor();
        g.setColor(Color.PINK);
        g.fillRect(rects[tabIndex].x, rects[tabIndex].y, 
               rects[tabIndex].width, rects[tabIndex].height);
        g.setColor(Color.BLUE);
        g.drawRect(rects[tabIndex].x, rects[tabIndex].y, 
               rects[tabIndex].width, rects[tabIndex].height);
        g.setColor(savedColor);
    }
 }

}

Ответы [ 4 ]

4 голосов
/ 22 октября 2011

Правильным способом было бы реализовать Custom Look & Feel .Но если вы хотите поиграть с XxxTabbedPaneUI, то, возможно, этот пост поможет вам в этом. код депо

2 голосов
/ 22 октября 2011

Первое (частичное) решение.Я нашел код "позиционирования".Это метод calculateTabRects в TabbedPaneLayout, внутренний класс BasicTabbedPaneUI.Метод чрезвычайно сложен, но хорошая новость заключается в том, что часть, которая «поднимается впереди» вкладки, хорошо прокомментирована и изолирована в своем собственном переопределенном методе!Это padSelectedTab.Создать класс, который ничего не делает, вместо того, чтобы поднимать компонент, так же просто, как:

    protected class MyTabbedPaneLayout extends TabbedPaneLayout {
        @Override
        protected void padSelectedTab(int tabPlacement, int selectedIndex) {
            //do nothing!
            //super.padSelectedTab(tabPlacement, selectedIndex);
        }
    }

Обратите внимание, что это должен быть внутренний класс MyTabbedPane.Он должен быть создан путем переопределения MyTabbedPane.createLayoutManager:

@Override
    protected LayoutManager createLayoutManager() {
        //return super.createLayoutManager();
         return new MyTabbedPaneLayout();
    }

Очень просто и действительно работает ... за исключением случая.CreateLayoutManager создает экземпляр TabbedPaneLayout, если tabLayoutPolicy имеет значение WRAP_TAB_LAYOUT, но создает экземпляр TabbedPanelScrollLayout, если tabLayoutPolicy имеет значение SCROLL_TAB_LAYOUT.Последний имеет частный и незащищенный доступ, поэтому его подкласс не представляется возможным!Моя имплементация createLayoutManager теряет прокручиваемое поведение.

1 голос
/ 24 марта 2014

Вы можете поместить теги Html в первый параметр следующим образом:

MyJTabbedPane.addTab("<html><h1 style='padding:20px;'>TEST</h1></html>", new JPanel());

1 голос
/ 22 октября 2011

Вы можете переопределить paintContentBorderTopEdge в MyTabbedPaneUI, чтобы он не думал, что выбрана какая-либо из вкладок.Это не очень хорошее решение, но хакерские классы пользовательского интерфейса редко поддаются моему опыту:)

@Override
protected void paintContentBorderTopEdge(Graphics g, int tabPlacement,
                       int selectedIndex, int x, int y, int w, int h) {
    super.paintContentBorderTopEdge(g, tabPlacement, -1, x, y, w, h);
}
...