3

私はプロジェクトに取り組んでおり、私の目標は、ウィンドウのサイズに応じてコンポーネントのサイズを変更することです。私はGridBagLayoutこれを使用していますが、ウィンドウのサイズが変更されたときにコンポーネントのサイズを変更すると、いくつかの問題が発生します。コンポーネントにweighty値を指定すると、すべて問題なく、コンポーネントのサイズが垂直方向に変更されます。http://imageshack.us/a/img211/9682/d8au.png しかし、weightx値を割り当てると、すべてがめちゃくちゃになります。ボタンのサイズが変わり、ラベル間に隙間ができます。 http://imageshack.us/a/img12/6946/ij4.png

すべてのコンポーネントにweightxとの値を割り当てるのではなく、必要なものだけに割り当てます。weightyGUI のコーディングはせず、コンポーネントをドラッグ アンド ドロップするだけなので、コードはありません。コンポーネントのサイズが正しく変更されるように、これを修正する方法についてアドバイスが必要です。これは が原因だと思いweightxますが、すべてをうまく機能させる方法がわかりません。

4

2 に答える 2

2

私のコメントで提案したように、また Hovercraft によって既に提案されているように、UI をセクションに分割し、各セクションのレイアウト要件に個別に焦点を当てることをお勧めします。そうしないと、1 つのコンポーネントに対して行う決定が不利になることがわかります。他の人への影響。

また、レイアウトが実際に何をしているのかを合理的に理解し、レイアウトを手作業でコーディングするまで、GUI デザイナーを避けることをお勧めします。誤解しないでほしいのですが、私は常に Netbeans フォーム デザイナーを使用していますが、特に動的で変化する UI を作成する必要がある場合は、多くの UI を手作業で微調整しています。

以下は、私が話していることを示しています。UI の各セクションを強調表示し、LineBorderそれを立たせるために a を使用しました。

ここに画像の説明を入力ここに画像の説明を入力

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class BadLayout25 {

    public static void main(String[] args) {
        new BadLayout25();
    }

    public BadLayout25() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BasePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class BasePane extends JPanel {

        public BasePane() {
            setLayout(new GridBagLayout());

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 2;
            gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
            gbc.weightx = 1.0;
            add(getTopPane(), gbc);

            gbc = new java.awt.GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
            gbc.weightx = 0.5;
            add(getOptionsPane(), gbc);

            gbc = new java.awt.GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 2;
            gbc.fill = java.awt.GridBagConstraints.BOTH;
            gbc.weightx = 0.5;
            gbc.weighty = 1.0;
            add(getButtonPane(), gbc);

            JTextArea textArea = new JTextArea(5, 20);

            gbc = new java.awt.GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 1;
            gbc.gridheight = 2;
            gbc.fill = java.awt.GridBagConstraints.BOTH;
            gbc.weightx = 0.5;
            gbc.weighty = 1.0;
            add(new JScrollPane(textArea), gbc);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(800, 400);
        }

        protected JPanel getTopPane() {
            JPanel topPane = new JPanel(new GridBagLayout());
            topPane.setBorder(BorderFactory.createLineBorder(java.awt.Color.RED));
            topPane.add(new JLabel("Lotereya:"));
            topPane.add(new JLabel("Yuklenilir"));
            return topPane;
        }

        protected JPanel getOptionsPane() {
            JPanel optionsPane = new JPanel(new GridBagLayout());
            optionsPane.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 255, 0)));
            GridBagConstraints gbc = new GridBagConstraints();

            gbc = new GridBagConstraints();
            gbc.anchor = java.awt.GridBagConstraints.LINE_START;
            optionsPane.add(new JLabel("Tiraj nomre:"), gbc);

            gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.gridwidth = 2;
            gbc.anchor = java.awt.GridBagConstraints.LINE_START;
            optionsPane.add(new JLabel("Sablon nomresi:"), gbc);

            JTextField field = new JTextField(10);
            gbc = new GridBagConstraints();
            gbc.gridx = 2;
            gbc.gridy = 1;
            gbc.anchor = java.awt.GridBagConstraints.LINE_START;
            gbc.weightx = 1.0;
            optionsPane.add(field, gbc);

            JComboBox comboBox = new JComboBox();
            gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.gridwidth = 2;
            gbc.anchor = java.awt.GridBagConstraints.LINE_START;
            gbc.weightx = 1.0;
            optionsPane.add(comboBox, gbc);

            return optionsPane;
        }

        protected JPanel getButtonPane() {
            JPanel buttonsPane = new JPanel(new GridBagLayout());
            buttonsPane.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 0, 255)));

            GridBagConstraints gbc = new GridBagConstraints();
            gbc = new java.awt.GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = -1;
            gbc.fill = java.awt.GridBagConstraints.BOTH;
            gbc.weightx = 0.25;
            gbc.weighty = 0.25;
            for (int index = 0; index < 9; index++) {
                if (index % 3 == 0) {
                    gbc.gridy++;
                    gbc.gridx = 0;
                } else {
                    gbc.gridx++;
                }
                buttonsPane.add(new JButton(String.valueOf(index + 1)), gbc);
            }
            gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 3;
            gbc.fill = java.awt.GridBagConstraints.BOTH;
            gbc.weightx = 0.25;
            gbc.weighty = 0.25;
            buttonsPane.add(new JButton("0"), gbc);

            gbc = new GridBagConstraints();
            gbc.gridx = 3;
            gbc.gridy = 0;
            gbc.fill = java.awt.GridBagConstraints.BOTH;
            gbc.weightx = 0.25;
            gbc.weighty = 0.25;
            buttonsPane.add(new JButton("Tesdiq"), gbc);
            gbc.gridy++;
            buttonsPane.add(new JButton("<ticket.apply>"), gbc);
            gbc.gridy++;
            buttonsPane.add(new JButton("<ticket.cancel>"), gbc);
            gbc.gridy++;
            buttonsPane.add(new JButton("<main menu>"), gbc);

            return buttonsPane;
        }
    }
}
于 2013-06-15T11:42:27.093 に答える
2

まず、このサイトで提案されているように、null レイアウトを使用しないでください。Null レイアウトの使用は、多くの場合、Swing の初心者によって提案されるソリューションです。これは、表面上および最初使いやすいためです。ただし、アプリケーションを実行しようとすると、見苦しいまたは機能しない GUI など、すべての問題が後で見つかります。また、変更したコンポーネントの右または下にある他のすべてのコンポーネントを手動で変更する必要があるため、GUI で何かを変更する場合は非常に困難です。レイアウト マネージャーを使用する利点は、面倒な作業をレイアウト マネージャーに任せることができるため、メンテナンスとアップグレードが簡単になることです。

ネストされたレイアウトで JPanel をネストすることをお勧めします。たとえば、電卓ボタンは固定グリッドとして動作するため、下部にボタンがない JLabel プレースホルダーで GridLayout を使用します。

必要に応じて外側の GUI JPanel を GridBagLayout にするか、他の簡単なレイアウトを簡単に組み合わせることができます。

于 2013-06-15T10:53:13.670 に答える