6

学校でのプロジェクトの GUI に取り組んでいます。私はスイングで GridBagLayout を使用しています。

入力を示すラベル (ファイルの種類 @ x = 0, y = 0) があり、その後に別のラベル (一度選択された実際のファイル名 @ x = 1, y = 0) が続き、その後にファイル チューザー ( @ x = 2, y = 0)の参照ボタンが続きます。 . のラベル(1,0)は最初は空白ですが、ラベルにテキストが含まれていないときに、テキストが占める領域がスペースを占めるようにしたいと考えています。また、ラベル at(0,0)とボタン at の間のスペースを(2,0)一定に保ちたいと考えています。

これを実現するために、ラベルをパネルに配置してから、レイアウトを操作しようとしています。しかし、私は望ましい結果を達成するために縫い合わせることができません。誰でもいくつかの提案を提供できますか? GridBagLayout の次の 3 行は、まったく同じように配置されます。

GUI のスクリーン ショットへのリンクを次に示します。

その写真

    calibrationFileSelectionValueLabel = new JLabel("",Label.LEFT);
    calibrationFileSelectionValueLabel.setName("calibrationFileSelection");
    calibrationFileSelectionValueLabel.setMinimumSize(new Dimension(100,0));



    calibrationFileSelectionValuePanel = new JPanel();
    calibrationFileSelectionValuePanel.setBorder(BorderFactory.createEtchedBorder());
    calibrationFileSelectionValuePanel.add(calibrationFileSelectionValueLabel);

    c.gridx = 0;
    c.gridy = 0;
    c.fill = GridBagConstraints.NONE;

    filesPanel.add(calibrationFileLabel,c);

    c.gridy = 1;
    filesPanel.add(frequencyFileLabel,c);

    c.gridy = 2;
    filesPanel.add(sampleFileLabel,c);

    c.gridy = 3;
    filesPanel.add(outputFileLabel,c);

    c.gridx = 1;
    c.gridy = 0;
    c.fill = GridBagConstraints.BOTH;

   // filesPanel.add(calibrationFileSelection,c);
    filesPanel.add(calibrationFileSelectionValuePanel,c);

    c.gridy = 1;
   // filesPanel.add(frequencyFileSelection,c);
    filesPanel.add(frequencyFileSelectionValueLabel,c);

    c.gridy = 2;
   // filesPanel.add(sampleFileSelection,c);
    filesPanel.add(sampleFileSelectionValueLabel,c);

    c.gridy = 3;
   // filesPanel.add(outputFileSelection,c);
    filesPanel.add(outputFileSelectionValueLabel,c);

    c.gridx = 2;
    c.gridy = 0;
    c.fill = GridBagConstraints.NONE;
    filesPanel.add(calibrationFileSelectionButton,c);

    c.gridy = 1;
    filesPanel.add(frequencyFileSelectionButton,c);      

    c.gridy = 2;
    filesPanel.add(sampleFileSelectionButton,c);

    c.gridy = 3;
    filesPanel.add(createOutputFileButton,c);       

    panelForFilesPanelBorder = new JPanel();
    panelForFilesPanelBorder.setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(5,10,5,10), BorderFactory.createEtchedBorder()));
    panelForFilesPanelBorder.add(filesPanel);

    buttonsPanel = new JPanel();
    buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    buttonsPanel.setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(5,10,10,10), BorderFactory.createEtchedBorder()));
    buttonsPanel.add(startButton);
    buttonsPanel.add(stopButton);
    basePanel.add(panelForFilesPanelBorder);
    basePanel.add(numericInputPanel); 
    basePanel.add(buttonsPanel); 
4

4 に答える 4

4

基本的に、GridBagLayout はコンポーネントをグリッド内の長方形 (セル) に配置し、コンポーネントを使用しpreferred sizesてセルの大きさを決定します。このレイアウトでは

  • コンテナーのサイズが優先サイズよりも小さい場合にのみ、最小サイズが使用されます。
  • empty( "") テキストを使用すると、 を使用またはオーバーライドして、優先サイズのヒントが明示的に指定されていない場合、 AJLabel\JTextFeild\JButtonの優先サイズは aroundになります。(2,2)setPreferredSize(size)getPreferredSize(size)

彼の時点では、最小サイズの設定は機能しません。空のテキストを含む優先サイズが周囲に(2,2)あり、コンテナーのサイズが既に優先サイズよりも大きいためです。GridBagLayout最小サイズをまったく気にせずに優先サイズを使用します。

GridBagLayout次の理由により、実際には優先サイズと最小サイズの両方を設定する必要があります。

好みのサイズだけを設定しようとする と、ウィンドウのサイズを縮小すると、最終的にコンテナー パネルのサイズが縮小されます。コンテナーのパネル サイズは、コンポーネントの推奨サイズよりも小さくJLabel\JTextFeild\JButtonなり 、最小サイズに縮小されます。この時点で最小サイズのヒントを与えていない場合は、デフォルトの最小サイズ: 周りにある可能性が高い(2,2)が使用されます。以下の実際の例でよりよく理解できます

その他の注意事項:

   c.gridx = 1;
    c.gridy = 0;
    c.fill = GridBagConstraints.BOTH;

   // filesPanel.add(calibrationFileSelection,c);
    filesPanel.add(calibrationFileSelectionValuePanel,c);

を含むを追加しpanelていますcalibrationFileSelectionValueLabel。追加のパネルを使用する必要はなくcalibrationFileSelectionValueLabel、設定によってグリッドに直接追加するだけです (代わりにオーバーライドgetPreferedSize(Size)が推奨されます) preferredSize。ただし、インセットを に設定しGridBagConstraintsて、最初panelのものをもう少し見栄えよくしてみてください。

   gridBagCnst.insets = new Insets(3, 3, 3, 3); 

あなたのための最小限の実例:

私たちが言っていることが理解できない場合のために、この例では、問題を解決するために優先サイズのみを設定しました。ただし、最小サイズを設定していないため、上記の説明に合わせてウィンドウのサイズを変更してみてください。

ここに画像の説明を入力

ソースコード:

import java.awt.*;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.*;
import javax.swing.SwingUtilities;
import javax.swing.border.*;


/**
 *
 * @author Rashed
 */
 class GridBagLayoutDemo extends JFrame{


    public JLabel createLabel(String txt, int width, int height, Color color)
    {
        JLabel label = new JLabel(txt);
        label.setOpaque(true);
        label.setBackground(color);
        label.setPreferredSize(new Dimension(width, height));
        return label;
    }

    public GridBagLayoutDemo() throws HeadlessException {
      // setSize(400,400);
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       JPanel panel = new JPanel(new java.awt.GridBagLayout());
       panel.setBorder(new EmptyBorder(10, 10, 10, 10));
       GridBagConstraints labCnst = new GridBagConstraints();

       Dimension preferredSize = new Dimension(140,20);

       labCnst.insets = new Insets(3, 3, 3, 3);

       JLabel title = new JLabel("My Title");
       JLabel title2 = new JLabel("My Title");
       JLabel title3 = new JLabel("My Title");

       JLabel selectionLabel1 = new JLabel("");
       selectionLabel1.setBorder(new LineBorder(Color.BLACK));
       JLabel selectionLabel2 = new JLabel("");
       selectionLabel2.setBorder(new LineBorder(Color.BLACK));
       JLabel selectionLabel3 = new JLabel("");
       selectionLabel3.setBorder(new LineBorder(Color.BLACK));

       selectionLabel1.setPreferredSize(preferredSize);
       selectionLabel2.setPreferredSize(preferredSize);
       selectionLabel3.setPreferredSize(preferredSize);

       JButton browse1 = new JButton("Browse");
       JButton browse2 = new JButton("Browse");
       JButton browse3 = new JButton("Browse");


        labCnst.gridx = 0;
        labCnst.gridy = 0;
        panel.add(title, labCnst);
        labCnst.gridy = 1;
        panel.add(title2, labCnst);
        labCnst.gridy = 2;
        panel.add(title3, labCnst);

        labCnst.gridx = 1;
        labCnst.gridy = 0;
        panel.add(selectionLabel1, labCnst);
        labCnst.gridy = 1;
        panel.add(selectionLabel2, labCnst);
        labCnst.gridy = 2;
        panel.add(selectionLabel3, labCnst);

        labCnst.gridx = 3;
        labCnst.gridy = 0;
        panel.add(browse1, labCnst);
        labCnst.gridy = 1;
        panel.add(browse2, labCnst);
        labCnst.gridy = 2;
        panel.add(browse3, labCnst);


       //labCnst.anchor = GridBagConstraints.LINE_END;


       add(panel);
       pack();

    }


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

            @Override
            public void run() {
                new GridBagLayoutDemo().setVisible(true);
            }
        });
    }
}
于 2013-11-02T06:51:48.940 に答える
1

John のトリックを使用して Sage のプログラムを修正" "し、独自のフレーバーを少し追加して、GridBagConstraint折りたたんだり展開したりしたときにダイアログがより自然にサイズ変更されるようにしました。

public class GridBagLayoutDemo extends JFrame {

    public GridBagLayoutDemo() throws HeadlessException {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setLayout(new BorderLayout());

        JPanel panel = new JPanel(new java.awt.GridBagLayout());
        panel.setBorder(new EmptyBorder(10, 10, 10, 10));
        GridBagConstraints labCnst = new GridBagConstraints();

        Dimension preferredSize = new Dimension(140, 1);

        labCnst.insets = new Insets(3, 3, 3, 3);

        JLabel title = new JLabel("My Title");
        JLabel title2 = new JLabel("My Title");
        JLabel title3 = new JLabel("My Title");

        final JLabel selectionLabel1 = new JLabel(" ");
        selectionLabel1.setBorder(new LineBorder(Color.BLACK));
        final JLabel selectionLabel2 = new JLabel(" ");
        selectionLabel2.setBorder(new LineBorder(Color.BLACK));
        final JLabel selectionLabel3 = new JLabel(" ");
        selectionLabel3.setBorder(new LineBorder(Color.BLACK));

        setPreferredWidth(selectionLabel1, 120);
        setPreferredWidth(selectionLabel2, 120);
        setPreferredWidth(selectionLabel3, 120); 

        JButton browse1 = new JButton(new AbstractAction("Browse 1") {
            public void actionPerformed(ActionEvent arg0) {
                selectionLabel1.setText("C:\\Documents and Settings\\jsmith\\My Documents\\Studio 2014\\Projects\\1");
            }
        });
        JButton browse2 = new JButton(new AbstractAction("Browse 2") {
            public void actionPerformed(ActionEvent arg0) {
                selectionLabel2.setText("C:\\Documents and Settings\\jsmith\\My Documents\\Studio 2014\\Projects\\2");
            }
        });
        JButton browse3 = new JButton(new AbstractAction("Browse 3") {
            public void actionPerformed(ActionEvent arg0) {
                selectionLabel3.setText("C:\\Documents and Settings\\jsmith\\My Documents\\Studio 2014\\Projects\\3");
            }
        });

        labCnst.gridx = 0;
        labCnst.gridy = 0;
        panel.add(title, labCnst);
        labCnst.gridy = 1;
        panel.add(title2, labCnst);
        labCnst.gridy = 2;
        panel.add(title3, labCnst);

        labCnst.weightx = 1;
        labCnst.fill = GridBagConstraints.HORIZONTAL;
        labCnst.gridx = 1;
        labCnst.gridy = 0;
        panel.add(selectionLabel1, labCnst);
        labCnst.gridy = 1;
        panel.add(selectionLabel2, labCnst);
        labCnst.gridy = 2;
        panel.add(selectionLabel3, labCnst);

        labCnst.weightx = 0;

        labCnst.gridx = 3;
        labCnst.gridy = 0;
        panel.add(browse1, labCnst);
        labCnst.gridy = 1;
        panel.add(browse2, labCnst);
        labCnst.gridy = 2;
        panel.add(browse3, labCnst);

        add(panel, BorderLayout.CENTER);
        pack();

    }

    private void setPreferredWidth(JComponent c, int w) {
        Dimension d = c.getPreferredSize();
        d.width = w;
        c.setPreferredSize(d);
    }

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

            @Override
            public void run() {
                GridBagLayoutDemo demo = new GridBagLayoutDemo();
                demo.setLocationRelativeTo(null);
                demo.setVisible(true);
            }
        });
    }
}
于 2013-11-02T10:23:13.340 に答える