2

以下の例では、GridBagLayoutを持つ別のJPanelを含むBoxLayoutを持つJPanelがあります。

垂直接着剤を追加することにより、内側パネルの内容が外側パネルの上部に「接着」されることを期待しています。

しかし、中央に「A」というラベルがあります。GridBagLayoutを削除すると、Aが上部に表示されます。なぜこれが起こるのですか?

import javax.swing.*;
import java.awt.*;

public class Test {
    public static void main(String[] args) {
        JPanel contentPane = new JPanel();        

        JFrame frame = new JFrame();
        frame.setContentPane(contentPane);

        contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));

        JPanel gridBagPanel = new JPanel();
        gridBagPanel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.NONE;

        gridBagPanel.add(new JLabel("A"), gbc);
        contentPane.add(gridBagPanel);
        contentPane.add(Box.createVerticalGlue());

        frame.setSize(800, 200);
        frame.setVisible(true);
    }
}
4

3 に答える 3

3

anchorのプロパティのデフォルト値GridBagConstraintsはですCENTER。内部パネルにJLabelの推奨サイズよりも多くのスペースがある場合、JLabelは内部パネルの使用可能なスペースを基準にして中央に配置されます(塗りつぶしをNONEに設定したため)。

アンカー値NORTHWESTを使用して、ラベルをパネルの上部に接着できます。

GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.weighty = 1;
gbc.weightx = 1;

また、Javaドキュメントごとに重みを設定する必要があります。「weightxまたはweightyにゼロ以外の値を少なくとも1つ指定しない限り、すべてのコンポーネントがコンテナの中央に集まります。これは、重みが0.0(デフォルト)の場合に発生するためです。 )、GridBagLayoutは、セルのグリッドとコンテナのエッジの間に余分なスペースを配置します。 "

于 2011-12-29T18:40:48.220 に答える
1

それはおそらくGridBagLayoutお尻の痛みのためであり、他のレイアウトマネージャーの使用を検討する必要があります。または、コンポーネントの水平方向と垂直方向の配置を設定する必要がある場合もあります。setAlignmentXsetAlignmentYのを見てくださいJComponent。コンポーネントの動作に問題があった場合は、すべてを同じように配置しなかったためです。

于 2011-12-29T18:30:49.737 に答える
0

KavkaのAnswerは、アンカーを使用してパネルの上部にAを配置するという要件を解決していますが、BoxLayoutパネルで宣言された垂直接着剤は実際には何もしません。そこで、これを拡張して、GridBagLayoutsでウェイトと垂直接着剤を使用することについて理解したことに貢献します。

GridBagLayoutは複雑なものであるため、複数の理由がある可能性がありますが、Kavkaがすでに指摘しているように:

デフォルト値0.0からゼロ以外のweightx値への変更が重要です。weighty

GridBagConstraintsのJavaチュートリアルドキュメントで指摘されているように、 JavaDoc for GridBagLayoutの説明セクションと、JavaDocforGridBagConstraintsの特定のパラメータの説明。

すべての重みがゼロの場合、セルのグリッドとセルのグリッドの間にすべての余分なスペースが表示されます。

  • weightxの場合、左端と右端の間に余分なスペースが追加で表示されます。
  • 重量がある場合は、上端と下端の間に余分なスペースが追加で表示されます。

したがって、空のセルを埋めるために垂直接着剤を使用する場合は、接着剤コンポーネントに、拡張したい方向にゼロ以外の重みを与えるようにする必要があります。GridBagLayoutのみを使用するので、gridyパラメーターを使用して、コンポーネントの垂直分布を定義できます。

元のコードをベースの例として取り上げ、それを少し拡張して、ウェイトと組み合わせた垂直接着剤の機能を示します。このコードは、Aをパネルの上部から20%に配置し、サイズ変更時にこの比率を維持します。

import javax.swing.*;
import java.awt.*;

public class Test {
    public static void main(String[] args) {   
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel gridBagPanel = new JPanel();
        gridBagPanel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridy = 0;
        gbc.weighty = 0.2;
        gridBagPanel.add(Box.createVerticalGlue(), gbc);
        gbc.gridy = 1;
        gbc.weighty = 0;
        gridBagPanel.add(new JLabel("A"), gbc);
        gbc.gridy = 2;
        gbc.weighty = 0.8;
        gridBagPanel.add(Box.createVerticalGlue(), gbc);

        frame.setContentPane(gridBagPanel);
        frame.setSize(800, 200);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

接着剤の仕組みの詳細については、「BoxLayoutの使用方法に関するJavaチュートリアル」の「フィラー」セクションを参照してください。

于 2014-05-07T14:03:52.530 に答える