11

GroupLayout動的に生成されたデータ入力フォームのコンポーネントを管理するために使用しています。レイアウトは多かれ少なかれ次のようになります。

*-----------------------------------------------*
| label A     |   field A                       | 
| label B     |   field B                       |
| label C     |   field C                       |
*-----------------------------------------------*

水平レイアウトに2つの並列グループを使用し、垂直レイアウトに1つの順次グループを使用しています。ほとんどの場合、すべてが正常に機能しています。

JLabelラベル(の単なるインスタンス)の最大幅を親の幅の1/3に制限したいと思いますJFrame。が固定サイズの場合、JFrameこれは簡単ですが、サイズ変更に対処する必要があります。

私はComponentListener.componentResized()イベントをピックアップしていますが、JFrameそのようなイベントを受け取ったらどうするかについて少し行き詰まっています。

私は運がなくてもこのアプローチを試しました:

public void componentResized(ComponentEvent e) {
    int maxW = parentFrame.getWidth() / 3;
    for (JLabel l : labels) {
        l.setMaximumSize( // have also tried setSize() and setPreferredSize()
            new Dimension(
                Math.min(l.getSize().width, maxW),
                l.getMaximumSize().height));
    }
    groupLayout.invalidateLayout(getContentSpace());
}

誰かが機能するラベルの幅を制限する方法を提案できますか?

毎回レイアウトを一から作り直すこともできるかもしれませんが、もっと簡単な方法があるはずだと思います。

4

1 に答える 1

29

この例では、は、どの方法GroupLayoutにも頼ることなく、ラベルの優先サイズに単純に依存できます。setXXXSize()このアプローチでは、

  • ラベル用のスペースは常に最大のラベルを収容します。
  • テキストフィールドは、便利な方法でサイズ変更できます。
  • 結果は、プラットフォームとフォント全体で正しいです。
  • 「ほとんどのコンポーネントに何も指定する必要はありません…コンポーネント自体がデフォルトで望ましいサイズ変更動作をしているためです。」— <a href = "http://docs.oracle.com/javase/tutorial/uiswing/layout /group.html "rel="noreferrer"> GroupLayoutの使用方法:コンポーネントのサイズとサイズ変更可能性

GroupLayout.Alignment.TRAILINGラベルを右揃えにするための使用は個人的な好みであり、別のレイアウトにネストされてどのように機能するかを示す2番目のパネルを追加しました。

ここに画像の説明を入力してください

import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/** @see http://stackoverflow.com/questions/8492065 */
public class GroupPanel extends JPanel {

    private JLabel label1 = new JLabel("Primary:");
    private JTextField field1 = new JTextField(16);
    private JLabel label2 = new JLabel("Secondary:");
    private JTextField field2 = new JTextField(16);
    private JLabel label3 = new JLabel("Tertiary:");
    private JTextField field3 = new JTextField(16);

    public GroupPanel(int n) {
        this.setBorder(BorderFactory.createTitledBorder("Panel " + n));
        GroupLayout layout = new GroupLayout(this);          
        this.setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);
        layout.setHorizontalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
                .addComponent(label1)
                .addComponent(label2)
                .addComponent(label3))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addComponent(field1)
                .addComponent(field2)
                .addComponent(field3))
        );
        layout.setVerticalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label1)
                .addComponent(field1))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label2)
                .addComponent(field2))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label3)
                .addComponent(field3))
        );
    }

    private static void display() {
        JFrame f = new JFrame("GroupPanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS));
        f.add(new GroupPanel(1));
        f.add(new GroupPanel(2));
        f.add(Box.createVerticalGlue());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                display();
            }
        });
    }
}
于 2011-12-14T12:48:06.020 に答える