Есть ли способ скрыть панель вкладок 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);