webdevqa.jp.net

BoxLayoutを使用してコンテナ内のコンポーネントサイズを設定する方法

BoxLayoutの使用に関する問題に直面しました

私の例では、テキストフィールドの高さを減らし、ボタンの幅を変更しようとしています(図の緑色のマーカーで示されているように)。 setPrefferedSize()とsetMaximumSize()のテクニックについては知っていますが、正常に機能しませんでした。行add(Box.createHorizo​​ntalGlue())も役に立ちませんでした。

アイデアをありがとう

public class Testy extends JPanel {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                constructGUI();
            }
        });
    }

    private static void constructGUI() {
        JFrame frame = new JFrame("Testy");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.DARK_GRAY);
        centerPanel.setPreferredSize(new Dimension(100, 400));
        frame.add(centerPanel, BorderLayout.CENTER);

        Testy eastPanel = new Testy();
        frame.add(eastPanel, BorderLayout.EAST);

        frame.pack();
        frame.setVisible(true);
    }

    public Testy() {
        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));

        JButton button = new JButton("Button ...... 1");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        add(button);

        button = new JButton("Button 2");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        add(button);

        button = new JButton("Button ........... 3");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        add(button);

        JLabel label = new JLabel("Label");
        //label.setPreferredSize(...);
        //label.setMaximumSize(...);
        add(label);

        JTextField textField = new JTextField();
        //textField.setPreferredSize(...);
        //textField.setMaximumSize(...);
        add(textField);

        button = new JButton("Button 4");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        add(button);

        //add(Box.createHorizontalGlue());
    }
}

picture

8
Dumas45

まず、Java Swingのコンポーネントの位置とサイズは、コンポーネント自体ではなく、レイアウトマネージャー(レイアウトマネージャーが設定されている場合)に依存することを理解する必要があります。コンポーネントはマネージャーにサイズを要求します。

この場合、私は異なるレイアウトを使用します-GridLayoutとBorderLayoutの組み合わせで十分で、非常にシンプルで簡単です。しかし、BoxLayoutを使用したい場合は、...

  1. ドキュメントによると:

    BoxLayoutは、コンポーネントの要求された最小、優先、および最大サイズに注意を払います。レイアウトを微調整しているときに、これらのサイズを調整する必要がある場合があります。 ...たとえば、ボタンの最大サイズは通常、優先サイズと同じです。追加のスペースが利用可能なときにボタンをより広く描画したい場合は、最大サイズを変更する必要があります。

  2. 次に、コンポーネントの最大サイズを設定します。c.setMaximumSize(new Dimension(Integer.MAX_VALUE, c.getMinimumSize().height));cbuttonlabelおよびtextFieldを意味します)

編集1:

動作するソースコードは次のとおりです。

_import Java.awt.BorderLayout;
import Java.awt.Color;
import Java.awt.Dimension;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Testy extends JPanel {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                constructGUI();
            }
        });
    }

    private static void constructGUI() {
        JFrame frame = new JFrame("Testy");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        centerPanel.setBackground(Color.DARK_GRAY);
        centerPanel.setPreferredSize(new Dimension(100, 400));
        frame.add(centerPanel, BorderLayout.CENTER);

        Testy eastPanel = new Testy();
        frame.add(eastPanel, BorderLayout.EAST);

        frame.pack();
        frame.setVisible(true);
    }

    public Testy() {
        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));

        JButton button = new JButton("Button ...... 1");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        button = new JButton("Button 2");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        button = new JButton("Button ........... 3");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        JLabel label = new JLabel("Label");
        //label.setPreferredSize(...);
        label.setMaximumSize(new Dimension(Integer.MAX_VALUE, label.getMinimumSize().height));
        add(label);

        JTextField textField = new JTextField();
        //textField.setPreferredSize(...);
        textField.setMaximumSize(new Dimension(Integer.MAX_VALUE, textField.getMinimumSize().height));
        add(textField);

        button = new JButton("Button 4");
        //button.setPreferredSize(...);
        button.setMaximumSize(new Dimension(Integer.MAX_VALUE, button.getMinimumSize().height));
        add(button);

        // add(Box.createVerticalGlue());
    }
}
_

Screenshot

編集2:

右の列の下部にボタン4を配置する場合は、この行add(Box.createVerticalGlue());add(textField);button = new JButton("Button 4");の間に追加します。

24
Boris Šuška

簡単な解決策として、ネストされたレイアウトを使用できます。つまり、右側でJPanelを使用してBorderLayoutを作成し、CENTERJPanel(say compPanel)を配置し、PAGE_ENDJPanel(say buttonPanel)を配置します。ロケーション。次に、新しいJPanel(say panel)GridLayoutとともに使用し、その上にすべてのコンポーネントを配置し、このcompPanelcenterPanel内に配置します。 JButton(button4)buttonPanel内にそのまま配置します。

逆に、BoxLayoutは、特定のJComponentの推奨サイズを尊重します。これは通常、JComponentが保持するコンテンツに基づいて計算されるか、明示的に指定されるため、コンポーネントは他の特定のコンポーネントに対して適切に整列しない傾向があります。

これが実際の例です:

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

public class Testy extends JPanel {        

    private JPanel panel;
    private JPanel buttonPanel;

    public Testy() {
        setLayout(new BorderLayout(5, 5));

        JPanel compPanel = new JPanel();
        panel = new JPanel(new GridLayout(6, 1, 5, 5));     
        JButton button = new JButton("Button ...... 1");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        panel.add(button);

        button = new JButton("Button 2");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        panel.add(button);

        button = new JButton("Button ........... 3");
        //button.setPreferredSize(...);
        //button.setMaximumSize(...);
        panel.add(button);

        JLabel label = new JLabel("Label");
        //label.setPreferredSize(...);
        //label.setMaximumSize(...);
        panel.add(label);

        JTextField textField = new JTextField();
        //textField.setPreferredSize(...);
        //textField.setMaximumSize(...);
        panel.add(textField);
        compPanel.add(panel);

        buttonPanel = new JPanel();
        button = new JButton("Button 4");
        buttonPanel.add(button);

        add(compPanel, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.PAGE_END);
    }

    private void constructGUI() {
        JFrame frame = new JFrame("Testy");
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        frame.getContentPane().setLayout(new BorderLayout(5, 5));
        centerPanel.setBackground(Color.DARK_GRAY);
        frame.add(centerPanel, BorderLayout.CENTER);

        frame.add(this, BorderLayout.LINE_END);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Testy().constructGUI();
            }
        });
    }
}

出力:

LAYOUT EXAMPLE

4
nIcE cOw

これは、描画に基づいて近づくはずです。JLabelの下のコンポーネントで作業する必要があります(setPreferredSize()を使用)。

JPanel main = new JPanel(new GridLayout(1, 2));

JPanel left = new JPanel();
//left.setPreferredSize(some size);
JPanel right = new JPanel(new GridLayout(6, 1));
//right.setPreferredSize(some size);

right.add(new JButton("Button 1"));
//...
right.add(new JButton("Button 4"));

main.add(left);
main.add(right);
1
Fernando