2010-03-04 248 views
3

我在我的Java應用程序中調整了一些組件的大小時遇到​​問題。當我調整我的主要JFrame的大小時,他們保持原來的大小,而不是填充周圍的組件。調整大小JScrollPane和JTabbedPane的問題

例如我在我的程序中有另一個JTabbedPane(位於主JFrame內)的選項卡內的JTabbedPane。我使標籤添加到內部JTabbedPane通過各種.setPreferredSize()填充整個周圍空間。然後,當我通過拖動窗口的角來調整JFrame的大小時,外部JTabbedPane的選項卡調整得很好,但位於其中的JTabbedPane保持原來的大小。

當我用JScrollPane測試它時,會發生同樣的情況:由JScrollPane調整的外部JTabbedPane保持相同大小。

下面是創建標籤面板的代碼,以防萬一您可以看到我錯過的東西。它是createEndGamePane()中的tabPane/jsp對象,而不是在調整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

佈局經理,我喜歡的是,允許最大的靈活性 (http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbag.html)中的GridBagLayout。

尤其是,如果希望組件填充所有可用空間,則不應使用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正好用於填充空間。 – 2010-03-04 21:50:20

0

正如其他人所說,你需要使用處理您的GUI的佈局要求。

但是,我建議您的主要佈局管理器是一個基於表格的佈局,如MatrixLayout,MigLayout,TableLayout或其他任何一種免費的佈局管理器。

使用基於表格的佈局將簡化您的GUI編碼大約一個數量級,因爲它將大大減少所需的佈局嵌套量。我發現90%的圖形用戶界面都是由一個佈局管理器完成的,剩下的10%依賴於Java提供的更簡單的佈局管理器。

我從來沒有原因使用GridBagLayout,我絕對不要推薦它 - 這是不必要的複雜,使進行中的維護更難。