3

Java アプリケーションの一部のコンポーネントのサイズ変更に問題があります。メインの JFrame のサイズを変更すると、周囲のコンポーネントを埋める代わりに、以前のサイズが維持されます。

たとえば、私のプログラムでは、別の JTabbedPane (メイン JFrame 内にある) のタブ内に JTabbedPane があります。内側の JTabbedPane に追加されたタブが、さまざまな .setPreferredSize() を介して周囲のスペース全体を埋めるようにします。次に、ウィンドウの隅をドラッグして JFrame のサイズを変更すると、外側の JTabbedPane のタブのサイズが正常に変更されますが、その中にある JTabbedPane は同じ古いサイズのままです。

JScrollPane でテストすると、同じことが起こります。外側の JTabbedPane は JScrollPane によってサイズ変更され、同じサイズのままです。

以下は、私が見逃した明らかな何かが見られる場合に備えて、タブ付きパネルを作成するためのコードです。JFrame のサイズが変更されたときにサイズが変更されないのは、createEndGamePane() の tabPane/jsp オブジェクトです。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

他の人が言ったように、GUI のレイアウト要件を処理するに は、レイアウト マネージャーを使用する必要があります。

ただし、プライマリ レイアウト マネージャーは、 MatrixLayoutMigLayoutTableLayout、または他の多くの無料のもののいずれかのようなテーブル ベースのレイアウトにすることをお勧めします。

テーブルベースのレイアウトを使用すると、必要なレイアウトのネストの量が大幅に削減されるため、GUI コーディングが約 1 桁簡素化されます。私の GUI の 90% は 1 つのレイアウト マネージャーで実行され、残りの 10% は Java で提供されるより単純なレイアウト マネージャーを使用していることがわかります。

私は GridBagLayout を使用する理由がなかったので、絶対にお勧めしません。これは不必要に複雑であり、継続的なメンテナンスが難しくなります。

于 2010-03-05T01:54:26.650 に答える