Есть ли способ скрыть панель вкладок JTabbedPane, если существует только одна вкладка?

Я хочу поведение, подобное, например. Firefox, в котором список доступных вкладок отображается только в том случае, если существуют как минимум две вкладки.

Я пока не смог найти ничего подобного.

Лучшей идеей, которая у меня была, было изменение макета вручную:

  • в случае одного компонента просто добавьте его на окружающую панель
  • если компонент добавлен, удалите компонент из окружающей панели, вместо этого добавьте JTabbedPane и добавьте как предыдущий, так и новый компонент в эту панель.
  • если компонент удален, а на панели остался только один компонент, удалите панель и вместо нее добавьте содержащийся компонент.

Хотя это, вероятно, сработает, это похоже на взлом или обходной путь...

Любая лучшая идея?

В идеале решение должно работать как в Java 1.5, так и в 1.6... но я был бы рад и решению только для 1.6.


person Huxi    schedule 03.06.2009    source источник


Ответы (7)


Я считаю, что вам придется сделать это вручную. По-видимому, это уже было сделано раньше, но только как небольшая часть системы, которая кажется недоступной.

Ваш подход кажется мне хорошим. Я бы сделал это так же, как вы изложили, и обернул всю эту логику в собственный JComponent, чтобы он не казался хакерским.

person Michael Myers    schedule 03.06.2009
comment
Я подожду еще немного, чтобы посмотреть, есть ли у кого-то блестящая идея, прежде чем проверять ответ... - person Huxi; 03.06.2009
comment
Я согласен с @mmyers. Если у кого-то есть готовый компонент для этого, я был бы уверен, что он работает именно так. - person banjollity; 03.06.2009
comment
Прости. Если кто-нибудь найдет такой компонент или сделает его, я хотел бы услышать об этом. - person Michael Myers; 03.06.2009

Вы можете переопределить метод пользовательского интерфейса, который вычисляет высоту области кнопки вкладки, задав высоту 0, когда есть только одна вкладка:

tabbed_pane.setUI(new BasicTabbedPaneUI() {  
    @Override  
    protected int calculateTabAreaHeight(int tab_placement, int run_count, int max_tab_height) {  
        if (tabbed_pane.getTabCount() > 1)
            return super.calculateTabAreaHeight(tab_placement, run_count, max_tab_height);  
        else  
            return 0;  
    }  
});  
person Brad Mace    schedule 17.01.2012
comment
Это работает, но у меня была тонкая цветная верхняя граница на вкладке TabbedPane, которая не отображалась в той области, где раньше была вкладка. Немного попробовав и выполнив почти такое же переопределение для «paintTabBorder» и «paintTabBackground», проблема была решена. - person zoidbeck; 27.08.2014

Возможно, вам будет лучше просто использовать CardLayout. .

person Eugene Ryzhikov    schedule 03.06.2009
comment
Хорошая общая идея, но я хочу иметь JTabbedPane, вкл. различные взгляды на PLAF. В любом случае, ваш вклад ценится. - person Huxi; 03.06.2009
comment
Просто jTabbedPane1.setLayout(new CardLayout()); +50! - person Hernán Eche; 27.07.2011
comment
@eugener Не могли бы вы добавить пример использования CardLayout с jTabbedPane1? можно ли установить CardLayout для этого объекта и, например, AbsoluteLayout для остальных?? - person Hernán Eche; 28.07.2011

Другим вариантом может быть настройка делегата L&F (либо BasicTabbedPaneUI, либо WindowsTabbedPaneUI, в зависимости от интересующих вас платформ), используемого JTabbedPane. Это позволит вам настроить поведение панели с вкладками в случае, когда отображается только одна вкладка.

Это еще один способ ведения дел, однако я бы сказал, что это довольно сложная задача, и выполнение того, что сказал Майкл, приведет вас туда, куда вы хотите, с гораздо меньшими усилиями. Я просто хотел опубликовать это как ответ на случай, если вы не знали об этой опции.

person Joshua    schedule 01.08.2011

Я думаю, что это может быть достигнуто с помощью панели вкладок и макета карты,

  • добавить панель вкладок и макет карты в макет сетки сетки, чтобы они автоматически изменяли размер
  • максимальная высота панели вкладок должна быть высотой вкладки
  • добавьте прослушиватель на панель вкладок, чтобы при нажатии на определенные вкладки он переключал макет карты, чтобы отображать соответствующий контент
  • скрыть панель вкладок, если она имеет только одну вкладку

и это должно сделать работу.

person Low Flying Pelican    schedule 03.08.2011

Да, есть способ. Мне потребовалось четыре часа, чтобы найти на веб-сайте оракула: http://docs.oracle.com/javase/7/docs/api/javax/swing/JTabbedPane.html#setTabLayoutPolicy%28%29

Просто используйте это:

//declare
private JTabbedPane editor = new JTabbedPane ();
//construct like this:
editor.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
//just add components and see how it goes.
editor.addTab("", newPanel);
person Rafał    schedule 11.12.2012

jTabbedPane1.removeTabAt(0); вроде работает после initComponents();

person Luchang Li    schedule 15.03.2019