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

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

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

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

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

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

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

Решение должно идеально работать как на Java 1.5, так и на 1.6... но я был бы счастлив и в отношении решения с 1,6.

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

и это должно выполнить эту работу.

Ответ 6

Да, есть способ. Мне потребовалось четыре часа, чтобы найти на сайте оракула: 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);