2

現在、Swing を使用したアプリケーションの GUI を設計しています。写真を見ると、BorderLayout 内に配置された黄色の JPanel が表示されます。このパネルは GridBagLayout を使用して、コンポーネントを内部に配置します。ご覧のとおり、コンポーネントの 1 つの行は、ラベル、テキスト フィールド、およびボタンで構成されています。現時点では、垂直方向の中央に 2 列のコンポーネントがあります。パネルの上から配置したいのですが。プロパティframe.setAlignmentY(TOP_ALIGNMENT)と同様に設定を試みましたが、結果はありませんでした。gridBagConstraints.anchorこの問題に対する私のアプローチは間違っていると思います。何時間も苦労する代わりに、stackoverflow の善良な人々に頼っています。

問題は、コンポーネントのグリッドを強制的に垂直方向に中央揃えではなく上部に配置する方法です。私を正しい方向に向けるアドバイスをありがとう。

フレーム

編集(コード):

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

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

/**
 * 
 * @author mt
 */
public class MainView extends JFrame {

    public MainView() {
        setPreferredSize(new Dimension(500, 500));
        getContentPane().setLayout(new BorderLayout());

        JPanel panel = new JPanel(new GridBagLayout());
        panel.setBackground(Color.YELLOW);
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(4, 4, 4, 4);

        c.gridx = 0;
        c.gridy = 0;
        panel.add(new JLabel("PokerStars"), c);

        c.gridx = 1;
        c.gridy = 0;
        panel.add(new JTextField(20), c);

        c.gridx = 2;
        c.gridy = 0;
        panel.add(new JButton("btn"), c);

        c.gridx = 0;
        c.gridy = 1;
        panel.add(new JLabel("Full Tilt Poker"), c);

        c.gridx = 1;
        c.gridy = 1;
        panel.add(new JTextField(20), c);

        c.gridx = 2;
        c.gridy = 1;
        panel.add(new JButton("btn"), c);

        add(panel, BorderLayout.LINE_START);

        pack();
        setVisible(true);
    }

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

1 に答える 1

1

OK、あなたの問題を解決する 1 つの方法は、追加の「見えない」コンポーネントを最後にpanel追加し、利用可能な余分な垂直スペースをすべて占有するようにすることです。これを行う方法は次のとおりです。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

/**
 * 
 * @author mt
 */
public class MainView extends JFrame {

    public MainView() {
        setPreferredSize(new Dimension(500, 500));
        getContentPane().setLayout(new BorderLayout());
        JPanel panel = new JPanel(new GridBagLayout());
        panel.setBackground(Color.YELLOW);
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(4, 4, 4, 4);
        panel.add(new JLabel("PokerStars"), c);

        panel.add(new JTextField(20), c);

        c.gridwidth = GridBagConstraints.REMAINDER;
        panel.add(new JButton("btn"), c);
        c.gridwidth = 1;

        panel.add(new JLabel("Full Tilt Poker"), c);

        panel.add(new JTextField(20), c);

        c.gridwidth = GridBagConstraints.REMAINDER;
        panel.add(new JButton("btn"), c);
        c.weighty = 1.0;
        panel.add(Box.createGlue(), c);

        add(panel, BorderLayout.LINE_START);

        pack();
        setVisible(true);
    }

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

これは私のお気に入りのオプションではありませんが、許容できる方法で問題を解決します. これを解決するもっと興味深い方法があるかもしれませんが、それには、対象としている UI の種類と、ウィンドウのサイズが変更されたときにさまざまなコンポーネントがどのように動作すると予想されるかを知る必要があります。

ほとんどの場合、gridx/を設定せずにgridyデフォルト値 ( RELATIVE) を使用するようにしてください。これにより、コードが短くなり、1 つ以上のコンポーネントを挿入する必要がある場合の保守がはるかに簡単になります。

于 2013-01-04T13:44:41.160 に答える