7

Javaのレイアウトマネージャーに厄介な問題があります。次の状況があります。パネルAには、絶対レイアウトの2つのパネルBとFlowLayoutのCがあります。Bは高度にカスタマイズされており、を介して固定サイズが設定されてsetPreferredSizeいます。CはBと同じ固定幅である必要がありますが、それ以外の場合は、フローに追加されるコンポーネントの数に応じて高さが可変になります。結果として得られるAは、固定された幅と高さを持つ必要があります–少なくともそれが私が望むものです。A.height + B.height

ただし、パネルAの幅は(希望のサイズを設定しても)まったく固定されておらず、パネルCの内容は自動的に折り返されるのではなく、長い行に表示されます。もちろん、これにより、Bの幅が本来よりも大きくなります。

それを修正するにはどうすればよいですか?より良いレイアウトはありますか、それとも絶対レイアウトを使用してすべてをエミュレートする必要がありますか?

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;

public class Test extends JPanel
{
    public Test ()
    {
        this.setLayout( new BoxLayout( this, BoxLayout.Y_AXIS ) );

        JPanel top = new JPanel( null );
        top.setBackground( Color.GREEN );
        top.setPreferredSize( new Dimension( 200, 20 ) );
        JPanel flowPanel = new JPanel( new FlowLayout( FlowLayout.LEFT, 2, 2 ) );

        this.add( top );
        this.add( flowPanel );

        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
        flowPanel.add( new JButton( "x" ) );
    }
}
4

4 に答える 4

10

ラップレイアウトが役立つはずです。

于 2010-09-06T15:19:21.833 に答える
0

必要な種類の高度なビュー構成を提供する最良の方法はFlowLayout、強力なGridBagLayoutManagerに置き換えることです。通常GridBagConstraintsで表される制約は、 GBCなどの流暢なサブクラスを使用するとはるかに理解しやすくなることに注意してください。

最後に、いつものように、Swingチュートリアルを参照することを検討する必要があります。

于 2010-09-06T12:06:32.317 に答える
0
  1. フレームに直接子を追加しないでください。常にcontentPane->に追加しますthis.getContentPage().add(...)

  2. レイアウトを機能させるには、 GridBagLayoutを含むJPanelをコンテンツページに配置し、そのパネルをコンテンツページ全体に配置します。

  3. GridBagLayoutに2列を指定します。

現在、ウィンドウの水平方向のサイズ変更を無効にすることはできないため、余分なスペースを処理する別の方法を見つける必要があります。最初の列に固定幅(set fill=NONE)を指定し、パネルCで残りのスペースを埋めることをお勧めします。

パネルのすべてのサイズ(最小、最大、優先)を優先サイズに設定した場合、パネルBのサイズは変更されません。

ヒント:Swingレイアウトが機能しない場合は、別のレイアウトにネストします。

于 2010-09-06T12:19:39.153 に答える
0

BorderLayoutのLINE_ENDまたはLINE_START部分に配置したものはすべて、幅を一定に保ちます。コンテナーのサイズが変更された場合、高さのみがサイズ変更されます。

NORTHとSOUTHは幅可変です

CENTERは幅と高さの可変です

LINE_STARTとLINE_ENDは高さ可変のみです

したがって、「C」コンテナをこの種のBorderLayout領域に配置することをお勧めします

于 2013-10-09T09:15:43.223 に答える