3

在我的 java 应用程序中调整某些组件的大小时遇到​​问题。当我调整主 JFrame 的大小时,它们会保持以前的大小,而不是填充周围的组件。

例如,我在我的程序中有一个 JTabbedPane 位于另一个 JTabbedPane(位于主 JFrame 内)的选项卡中。我通过各种 .setPreferredSize() 使添加到内部 JTabbedPane 的选项卡填充整个周围空间。然后,当我通过拖动窗口的角来调整 JFrame 的大小时,外部 JTabbedPane 的选项卡会调整大小,但位于其中的 JTabbedPane 保持相同的旧大小。

当我使用 JScrollPane 对其进行测试时,也会发生同样的事情:外部 JTabbedPane 由 JScrollPane 调整大小保持相同的大小。

下面是创建选项卡式面板的代码,以防您看到我错过的明显内容。它是 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);
    }

}
4

3 回答 3

1

如果您希望组件动态调整大小,则应避免告诉 Swing 它们的大小。相反,这个怎么样:

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

就这样。没有setPreferredSize()

于 2010-03-04T19:36:48.817 回答
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
于 2010-03-04T19:43:30.907 回答
0

正如其他人所说,您需要使用布局管理器来处理 GUI 的布局要求。

但是,我建议您的主要布局管理器是基于表格的布局,如MatrixLayoutMigLayoutTableLayout或其他许多免费布局。

使用基于表格的布局将简化您的 GUI 编码大约一个数量级,因为它将大大减少所需的布局嵌套量。我发现我 90% 的 GUI 是使用一个布局管理器完成的,剩下的 10% 使用 Java 提供的更简单的布局管理器。

我从来没有使用过 GridBagLayout 的理由,我绝对推荐它——它不必要地复杂并且使持续维护变得更加困难。

于 2010-03-05T01:54:26.650 回答