0

次のコードでは、Jpanel 汎用コンポーネントを作成し、Label と JTextField の 2 つのサブコンポーネントを追加します。コンポーネントを追加する予定ですが、左揃えになりません。

(いいえ、GridBagLayout は必要ありませんが、GridBag で基本的な例を実行しようとしていました。別のレイアウトではなく、GridBag でこれを行う方法を説明できますか)。

public Component buildStatusComponent() {

    // Place the components on one line //
    final GridBagLayout layout = new GridBagLayout(); 
    final GridBagConstraints constraints = new GridBagConstraints();              
    final JPanel group = new JPanel(layout);

    constraints.anchor = GridBagConstraints.WEST;
    constraints.gridx = 0;        
    constraints.fill = GridBagConstraints.NONE;
    group.setAlignmentX(JComponent.LEFT_ALIGNMENT);
    group.add(new JLabel("Messages: "), constraints);

    constraints.gridx = 1;
    constraints.fill = GridBagConstraints.HORIZONTAL;
    group.add(this.statusArea, constraints);        

    return group;
}

このレベルより上では、JPanel を追加して水平方向に塗りつぶしています。

constraints.gridy++;
constraints.fill = GridBagConstraints.HORIZONTAL;
this.add(this.buildStatusComponent(), constraints);
4

2 に答える 2

1

GridBagConstraints を完全に使用していないようです。group.setAlignmentX(JComponent.LEFT_ALIGNMENT) と入力する代わりに (これは何に対しても機能しないようです)、contraints.anchor = GridBagConstraints.WEST を使用します。

多くの人は GridBagLayout が好きではありませんが、仕組みを理解すれば簡単に操作できると思います。扱うのが最も難しいのは、グリッド内のオブジェクトの重みです。

しかし、特にこの質問では、コンポーネントを GridBagConstraint 定数のある側に固定し、制約クラスに依存してどこに行くかを制御したいだけです。

編集:わかりました、それから彼らに重みを与えてください。(これで問題が解決しないかもしれませんが)

constraints.weightx = 1d;

何が起こっているかというと、すべてが同じ重みを持っているため、間隔が均等になっていると思います。項目を「詰め込み」たい場合は、最後のコンポーネントの後に空の JPanel を追加し、fill = REMAINDER を設定して、それを重み 1 にし、他のコンポーネントを重み 0 にすることができます。 ' 別の周り。

GridBagConstraints gbc = new GridBagConstraints();
JPanel p = new JPanel(new GridBagLayout());
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.WEST;

p.add(new JLabel("A"), gbc);
gbc.gridx++;
p.add(new JLabel("B"), gbc);
gbc.gridx++;
gbc.weightx = 1d;
gbc.fill = GridBagConstraints.REMAINDER;
p.add(new JPanel(), gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.weightx = 0d;
.... continue on filling stuff...

これは、それに対処する 1 つの方法です。それがどのように機能するかを感じるまで、少し遊んでみてください。

于 2009-12-18T18:58:24.703 に答える
0

ランダムな数行のコードを投稿することの問題は、コードがどのように使用されているかのコンテキストがわからないことです。

GridBagLayoutの使用方法に関する Swing チュートリアルのセクションでは、weightx 制約を使用することが重要である理由を説明しています。親パネルと子パネルの両方が GridBagLayout を使用しているため、どこに問題があるのか​​わかりません。

さらに支援が必要な場合は、問題を示すSSCCEを投稿してください。

于 2009-12-18T20:32:15.517 に答える