web-dev-qa-db-ja.com

JPanelを別のJPanelで最大幅に拡張する方法

質問を少し言い換える必要があると思います。

以下の更新された質問

以下を含むJPanelがあります。

_myjpanel.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));
_

次の3つのパネルが含まれます:

固定サイズ「x」と「y」のJPanel

固定サイズのないJPanel

固定サイズがなく、高さが小さいJPanel

2番目のJPanelにはJTableが含まれているため、高さいっぱいに拡大され、下部パネルが完全に押し下げられます。

これのように:

_t
t
m
m
m
m
m
b
_

t =上部パネル、m =中央パネル、b =下部パネル。

うまくいきます。しかし、下部パネルは、問題となっている親の幅全体を埋めるようには感じられません。

_ttt
mmm
 b 
_

私はこれがどちらかを希望します、そこではパネルが幅全体を埋めます:

_ttt
mmm
bbb
_

またはこれ、下部パネルが左中央にある場合:

_ttt
mmm
b
_

以下の古い質問:

以下を含むJPanelがあります。

_.setLayout(new BoxLayout(selectors, BoxLayout.PAGE_AXIS));
_

その中に、さらに3つのJPanelsがあります。最初の2つは固定サイズで、中央の1つはそうではありません。

下部パネルは必要な高さだけを取得しますが、外側のJPanelの使用可能なすべての幅を使用します。

私は接着剤を使用しようとしましたが、役に立たず、優先サイズと最小/最大サイズを設定したくありません。レイアウトマネージャーとフレームワークだけを使用して、コンポーネントに「親全体の幅を埋める」ように指示する方法はありますか?サイズの設定やメソッドのオーバーライドのようなハックを始めたくありません。

注:接着剤やフィラーを内部パネルに配置することはできません。変更できるのは外部パネルとそのレイアウトマネージャーだけです。

試行1:

myPanel.setLayout(new GridLayout(3, 1));を使用しても、期待した結果が得られませんでした。それはこのようなグリッドを作りました:

_XX
 X
_

しかし、私は期待しました:

_X
X
X
_

試行2:

myPanel.setLayout(new GridLayout(0,1));を使用しても、期待した結果が得られませんでした。それはこのようなグリッドを作りました:

_x
x
x
_

しかし、すべてのパネルは拘束を無視して同じサイズでした。

13
Martin Nielsen

BorderLayoutを使用していて、bパネルがSOUTHまたはPAGE_ENDにある場合は、幅全体に表示されます。

7
Andrew Thompson

最も簡単な方法は、コンポーネントを自動的にサイズ変更して親コンテナーを満たすようにするGridLayoutなどの別のレイアウトマネージャーを使用することです。

myPanel.setLayout(new GridLayout(0, 1));
16
Reimeus

GridBagLayout を使用できます。そのためには、

gridBagObject.fill = GridBagConstraints.HORIZONTAL

GridBagLayoutに関連する1つの example が参考になります。

それに関連してコメントで尋ねられたように

BoxLayout は、コンポーネントの推奨サイズを尊重するもう1つの代替手段です。 GridBagLayoutがそれほど難しい場合は、それを試すことができます:-)

より明確にするために、GridBagLayoutを使用したコード:

import javax.swing.*;
import Java.awt.*;

/**
 * Created with IntelliJ IDEA.
 * User: Gagandeep Bali
 * Date: 1/10/13
 * Time: 7:43 PM
 */
public class GridBagExample
{
    private void displayGUI()
    {
        JFrame frame = new JFrame("GridBagLayout Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        CustomPanel topPanel = new CustomPanel(Color.BLUE.darker().darker());
        CustomPanel middlePanel = new CustomPanel(Color.CYAN.darker().darker());
        CustomPanel bottomPanel = new CustomPanel(Color.DARK_GRAY);

        JPanel contentPane = new JPanel();
        contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.FIRST_LINE_START;
        gbc.fill = GridBagConstraints.VERTICAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1.0;
        gbc.weighty = 0.3;

        contentPane.add(topPanel, gbc);

        gbc.gridy = 1;
        contentPane.add(middlePanel, gbc);

        gbc.gridy = 2;
        gbc.fill = GridBagConstraints.BOTH;
        contentPane.add(bottomPanel, gbc);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new GridBagExample().displayGUI();
            }
        });
    }
}

class CustomPanel extends JPanel
{
    public CustomPanel(Color backGroundColour)
    {
        setOpaque(true);
        setBackground(backGroundColour);
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(200, 150));
    }
}

出力:

GridBagExampleOutput

3
nIcE cOw