Есть ли способ скрыть панель вкладок JTabbedPane, если существует только одна вкладка? - PullRequest
17 голосов
/ 03 июня 2009

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

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

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

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

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

Есть идея получше?

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

Ответы [ 7 ]

12 голосов
/ 17 января 2012

Вы можете переопределить метод пользовательского интерфейса, который вычисляет высоту для области кнопки вкладки, увеличивая высоту до 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;  
    }  
});  
6 голосов
/ 03 июня 2009

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

6 голосов
/ 03 июня 2009

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

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

1 голос
/ 11 декабря 2012

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

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

//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);
1 голос
/ 03 августа 2011

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

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

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

1 голос
/ 01 августа 2011

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

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

0 голосов
/ 15 марта 2019

jTabbedPane1.removeTabAt(0);, кажется, работает после initComponents();

...