2010-03-04 5 views
3

У меня проблема с изменением размера некоторых моих компонентов в приложении Java. Когда я изменяю размер основного JFrame, они сохраняют прежний размер вместо заполнения окружающего компонента.Изменение размера JScrollPane и JTabbedPane

Например, у меня есть в моей программе JTabbedPane внутри вкладки другого JTabbedPane (который находится в основном JFrame). Я делаю вкладки, добавленные во внутреннюю JTabbedPane, заполняют все окружающее пространство через различные .setPreferredSize(). И затем, когда я изменяю размер JFrame, перетаскивая угол окна, вкладки внешнего JTabbedPane изменяются просто, но JTabbedPane, находящийся в нем, остается прежним.

То же самое происходит, когда я тестирую его с помощью JScrollPane: внешний размер JTabbedPane с помощью JScrollPane остается того же размера.

Ниже приведен код создания панелей с вкладками, если вы видите что-то очевидное, что я пропустил. Это объекты tabPane/jsp в createEndGamePane(), чем изменение размера при изменении размера JFrame. mainTabPane изменяет размеры, как следует.

class MyFrame extends JFrame { 
    private JTabbedPane mainTabPane; 
    private JPanel endGameInfo; 
    //.... 

    private void createTabbedCenterPane(){ 
     this.mainTabPane = new JTabbedPane(); 

     this.endGameInfo = new JPanel(); 

     this.createEndGamePane(); 

     this.mainTabPane.addTab("Turneringschema", null, this.scheduleHolder, "Spelschemat för turneringen"); 
     this.mainTabPane.addTab("Grupper & Pooler", null, this.poolInfo, "Information om grupper, lag och pooler"); 
     this.mainTabPane.addTab("Slutspelsträd", null, this.endGameInfo, "Information om slutspelen"); 

     this.add(this.mainTabPane, BorderLayout.CENTER); 
    } 

    private void createEndGamePane(){ 
     JTabbedPane tabPane = new JTabbedPane(); 
     tabPane.setPreferredSize(this.endGameInfo.getSize()); 

     for (int i = 0; i < this.tournament.data.getGroups().size(); i++) { 
      EndGame e = this.tournament.data.getEndGames().get(i);; 

      //Create the gameTree 
      EndGameTreeCanvas gameTree = new EndGameTreeCanvas(e, this.endGameInfo.getSize()); 

      //Create the ScrollPane 
      JScrollPane jsp = new JScrollPane(gameTree); 
      jsp.setPreferredSize(tabPane.getSize()); 
      jsp.setBorder(BorderFactory.createEmptyBorder()); 


      //Add to the endGameIndo panel 
      tabPane.addTab(this.tournament.data.getGroups().get(i).getName(), jsp); 
     } 

     this.endGameInfo.add(tabPane); 
    } 

} 

ответ

1

Если вы хотите, чтобы компоненты динамически изменялись, вам следует избегать указания Swing, каков их размер. Вместо этого, как насчет:

JTabbedPane tabs = new JTabbedPane(); 
JScrollPane inner1 = new JScrollPane(myOtherComponent); 
tabs.add("Scroll", inner1); 
JTabbedPane inner2 = new JTabbedPane(); 
tabs.add("Tabs", inner2); 

И все. Нет setPreferredSize().

0

Вы должны прочитать макет качели учебник: http://java.sun.com/docs/books/tutorial/uiswing/layout/index.html

Менеджер компоновки я предпочитаю это GridBagLayout, что позволяет максимальную гибкость (http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbag.html).

В частности, вы не должны использовать BorderLayout.CENTER, если хотите, чтобы компонент заполнил все свободное пространство вокруг него.

пример с менеджером GridBagLayout:

this.add(this.mainTabPane, 
    new GridBagConstraints(
    0,0, // position 
    1,1, // size 
    1.0,1.0, // fill ratio 
    GridBagConstraints.CENTER, GridBagConstraints.BOTH, // position inside the cell 
    new Insets(2,2,2,2),0,0)); // margins 
+0

BorderLayout.CENTER используется для заполнения пространства. –

0

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

Однако я рекомендую, чтобы ваш основной менеджер макетов был табличным расположением, например MatrixLayout, MigLayout, TableLayout или любым другим бесплатным.

Использование табличного макета упростит кодирование GUI примерно на порядок, поскольку оно значительно уменьшит требуемое количество вложенных макетов. Я считаю, что 90% моего графического интерфейса выполняется с одним менеджером макетов, а остальные 10% привлекают более простые менеджеры макетов, предоставляемые Java.

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

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