2009-06-03 7 views
14

Chcę zachowanie podobne do np. Firefox, w którym lista dostępnych kart pojawia się tylko wtedy, gdy istnieją co najmniej dwie karty.Czy istnieje sposób na ukrycie paska kart JTabbedPane, jeśli istnieje tylko jedna karta?

Nie udało mi się jeszcze znaleźć czegoś takiego.

Najlepszy pomysł miałem został ręcznie zmieniając układ:

  • w przypadku jednego składnika, wystarczy dodać, że do otaczającego panelu
  • jeśli składnik dodaje usunąć składnik z otaczającej panelu , dodaj zamiast tego JTabbedPane i dodaj do tego panelu zarówno poprzedni, jak i nowy komponent.
  • jeśli komponent zostanie usunięty i tylko jeden komponent zostanie pozostawiony w panelu, usuń okienko i dodaj zamiast niego wbudowany komponent.

Choć będzie to prawdopodobnie będzie działać to czuje się jak hack lub obejście ...

lepszy pomysł?

Rozwiązanie powinno idealnie działać zarówno w Javie 1.5, jak i 1.6 ... ale byłbym zadowolony również z rozwiązania tylko dla wersji 1.6.

Odpowiedz

5

Uważam, że będziesz musiał to zrobić ręcznie. Widocznie it has been done before, ale tylko jako niewielka część systemu, który wydaje się być niedostępny.

Twoje podejście wygląda mi dobrze. Zrobiłbym to tak, jak to ułożyłeś i zawijasz całą tę logikę w niestandardowym JComponent, więc poczujesz się mniej hackish.

+0

będę czekać trochę dłużej, aby zobaczyć, czy ktoś ma genialny pomysł przed sprawdzeniem odpowiedź ... – Huxi

+0

Zgadzam się z @mmyers. Jeśli ktoś ma gotowy komponent do tego, byłbym prawie pewien, że zadziałało to w ten sposób. – banjollity

+0

Dzięki, myślę, że tak naprawdę nie ma innej drogi ... – Huxi

5

Być może lepiej będzie po prostu użyć CardLayout.

+0

Dobry ogólny pomysł, ale chcę mieć JTabbedPane zaw. różne spojrzenia na PLAF. W każdym razie twoje wejście jest doceniane. – Huxi

+0

+1 za to, co bym zrobił – willcodejavaforfood

+0

Po prostu jTabbedPane1.setLayout (new CardLayout()); +50! –

1

Inną opcją byłoby dostosowanie delegata L & F (BasicTabbedPaneUI lub WindowsTabbedPaneUI w zależności od interesujących platform) używanych przez JTabbedPane. Umożliwiłoby to dostosowanie zachowania panelu z zakładkami w przypadku wyświetlania tylko jednej karty.

To jest inny sposób robienia rzeczy, ale powiedziałbym, że to dość przedsięwzięcie i robienie tego, co Michael powiedział, doprowadzi cię tam, gdzie chcesz, z mniejszym wysiłkiem. Chciałem opublikować to jako odpowiedź na wypadek, gdybyś nie wiedział o tej opcji.

1

myślę, że to może być osiągnięte za pomocą paska kart i układ kart,

  • dodać pasek kart i układ kart do układu torby siatki tak, że one re-size automatycznie
  • maksymalną wysokość z paska narzędzi powinna być wysokość zakładce
  • dodać detektor do paska kart tak, że gdy niektóre karty są kliknięciu go przełącza układ kart, aby pokazać odpowiedniej treści
  • ukryć pasek kart, jeśli ma tylko jeden tab

i to powinno załatwić sprawę.

11

Można zastąpić metodę UI, który oblicza wysokość na karcie obszar przycisku, zmuszając wysokość do 0 gdy istnieje tylko jedna zakładka:

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; 
    } 
}); 
+1

To działa, ale miałem cienką kolorową górną ramkę na moim TabbedPane, która została pominięta w obszarze, w którym znajdowała się zakładka. Trochę próba i wykonanie prawie tego samego zastąpienia dla "paintTabBorder" i "paintTabBackground" rozwiązało problem. – zoidbeck

Powiązane problemy