2013-07-19 2 views
2

Я хочу, чтобы метки на вкладке делились шириной JTabbedPane. Если есть одна вкладка, подходит вся ширина, если две вкладки, ширина доли, если три, 1/3 для каждого и так далее ...Изменение размера вкладки вкладки JTabbedPane для соответствия

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

Кто-нибудь понял, как сделать это самым простым способом?

+1

Вы нашли Look & Feel, который имеет желаемый 'TabbedPaneUI'? – trashgod

+0

Я использую и изменяю defaut Look & feel (MetalTabbedPane). Есть ли Looke & Feel, у которого есть эта возможность «установки вкладок»? –

ответ

2

Есть ли вид & Почувствуйте, что у этого есть возможность «установки вкладок»?

Я не знаю об этом, но вы можете разместить иллюстрации для тех, кто видел что-то подобное. Поскольку внешний вид контролируется делегатом пользовательского интерфейса F TabbedPaneUI, вам необходимо либо искать существующую реализацию, либо подкласс одного из ее потомков: BasicTabbedPaneUI или MetalTabbedPaneUI.

+0

Благодарим вас за ответ. Как сказал kleopatra, это начало найти мой ответ, но нет явного метода или изменения в переменных, которые сразу дают мне эту возможность, я думаю, мне придется немного подкрасить прямоугольники ... В любом случае , о том, чтобы не публиковать иллюстрации, моя репутация по-прежнему низкая для этого. Я действительно хотел опубликовать некоторые, но я не могу. –

+0

@ ThiagoPantaleão: Вы можете отредактировать свой вопрос, включив в него [sscce] (http://sscce.org/) на основе приведенного примера. – trashgod

6

Как уже отмечалось @trashgod, компоновка вкладок обрабатывается специфическим для LAF SomeLAFTabbedPaneUI, в частности TabbedPaneLayout. Таким образом, способ пойти

  • реализовать пользовательский подкласс MySomeLAFTabbedPaneUI, который имеет пользовательский расширенный TabbedPaneLayout (вы должны сделать это для каждого SomeLAF вы хотите поддержать
  • заменить обычный пользовательский интерфейс с помощью пользовательского класса

Первые сводится к тому, вклиниться в расчет прямоугольников, которые используются для окраски вкладок/размещения пользовательского tabComponents Что-то вроде. (Примечания: очевидно, не производство готового :-)

public class XMetalTabbedPaneUI extends MetalTabbedPaneUI { 

    public static ComponentUI createUI(JComponent c) { 
     return new XMetalTabbedPaneUI(); 
    } 

    @Override 
    protected LayoutManager createLayoutManager() { 
     return new XTabbedPaneLayout(); 
    } 


    protected class XTabbedPaneLayout extends MetalTabbedPaneUI.TabbedPaneLayout { 

     protected Container tabContainer; 

     @Override 
     protected void calculateTabRects(int tabPlacement, int tabCount) { 
      super.calculateTabRects(tabPlacement, tabCount); 
      // TODO: check if it makes sense to stretch 
      int max = 0; 
      int sum = 0; 
      Rectangle r = new Rectangle(); 
      for (int i = 0; i < tabCount; i++) { 
       getTabBounds(i, r); 
       max = Math.max(max, r.width); 
       sum += r.width; 
      } 
      // TODO: calculate real width, that is -insets 
      int paneWidth = tabPane.getWidth() - 10; 
      int free = paneWidth - sum; 
      // nothing to distribute 
      if (free < tabCount) return; 
      int add = free /tabCount; 
      int offset = 0; 
      for (int i = 0; i < tabCount; i++) { 
       r = rects[i]; 
       r.x += offset; 
       r.width += add; 
       offset += add; 
      } 

     } 

    } 
} 

Во-вторых, очень упрощено (уклонился от меня, как разработчик проекта :-) механизмом улучшения платины, предоставленным SwingX (на самом деле все, что вам нужно, это его модуль и зависимости). Его основной строительный блок является TabbedPaneAddon, который загружает пользовательский интерфейс:

public class TabbedPaneAddon extends AbstractComponentAddon { 

    /** 
    * @param name 
    */ 
    public TabbedPaneAddon() { 
     super("TabbedPane"); 
    } 

    @Override 
    protected void addMetalDefaults(LookAndFeelAddons addon, 
      DefaultsList defaults) { 
     // remove old ui 
     UIManager.getLookAndFeelDefaults().put("TabbedPaneUI", null); 
     defaults.add("TabbedPaneUI", 
       // here goes the full classname of your custom ui 
       // this is an example only :-) 
       "org.jdesktop.swingx.XMetalTabbedPaneUI"); 
    } 

    // implement other addXXDefault as needed for 
    // supporting more LAFs 
} 

сделать замену произошла, вы должны внести свой вклад в аддоне («ранним») в своем приложении:

LookAndFeelAddons.contribute(new TabbedPaneAddon()); 
+0

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

+0

hmm ...всегда думал, что с самого начала вы можете проголосовать за ответы на свой вопрос _ve_, вы видите стрелки вверх/вниз? – kleopatra

+0

Да, попробовал, появляется сообщение: «Vote Up требует 15 репутации». –

Смежные вопросы