2010-03-04 166 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,我绝对不要推荐它 - 这是不必要的复杂,使进行中的维护更难。