1

私はスイングするのが初めてで、問題は BoxLayout に関係していると思われます。フレームの上に一連のテキストフィールドとラベルを次々と配置しようとしています。これは私のコードです:

public static void main(String[] args) {
    JFrame frame = new JFrame("New Message");
    frame.setSize(100, 100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTextArea textArea = new JTextArea();
    frame.add(textArea, BorderLayout.CENTER);

    JPanel list = new JPanel();
    list.setLayout(new BoxLayout(list, BoxLayout.Y_AXIS));
    frame.add(list, BorderLayout.NORTH);

    String[] labels = {"To: ", "Cc: ", "Bcc: ", "Subject: "};
    for (int i = 0; i < labels.length; i++) {
        JLabel l = new JLabel(labels[i]);
        JTextField f = new JTextField();
        JPanel p = new JPanel();
        p.add(l, BorderLayout.WEST);
        p.add(f, BorderLayout.CENTER);
        list.add(p);
    }

    frame.pack();

    frame.setVisible(true);

}

結果は次のとおりです。 ここに画像の説明を入力

私が望むのは、To、Cc、Bcc、および Subject を左側に配置し、TextField を残りのスペースに配置することです。

4

3 に答える 3

3

いくつかの補足事項:

  • UI の初期化をSwingUtilities.invokeLater
  • JTextFieldには列数を指定し、 には行と列の両方を指定することを常にお勧めします。JTextArea
  • setSize()後で呼び出すと、を呼び出しても意味がありませんpack()。一般に、Swing コンポーネントでの使用は忘れてくださいsetSize()/setLocation/setBounds()(すべて LayoutManager に任せます)。

GridBagLayoutここでかなり良い仕事をします。GroupLayout働くこともできます。

次の例を参照してください。

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

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.SwingUtilities;

public class Mail {

    protected void initUI() {
        JFrame frame = new JFrame("New Message");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel list = new JPanel(new GridBagLayout());
        frame.add(list, BorderLayout.CENTER);
        GridBagConstraints labelGBC = new GridBagConstraints();
        labelGBC.insets = new Insets(3, 3, 3, 3); // Put some space between elements for nicer look
        labelGBC.anchor = GridBagConstraints.WEST; // Align left within its cell
        GridBagConstraints fieldGBC = new GridBagConstraints();
        fieldGBC.gridwidth = GridBagConstraints.REMAINDER; // Last element of the row
        fieldGBC.weightx = 1.0; // Cell takes up all extra horizontal space
        fieldGBC.fill = GridBagConstraints.HORIZONTAL; // Fill the cell horizontally
        fieldGBC.insets = new Insets(3, 3, 3, 3); // Put some space between elements for nicer look
        String[] labels = { "To: ", "Cc: ", "Bcc: ", "Subject: " };
        for (int i = 0; i < labels.length; i++) {
            JLabel l = new JLabel(labels[i]);
            JTextField f = new JTextField(50);
            list.add(l, labelGBC);
            list.add(f, fieldGBC);
        }
        GridBagConstraints taGBC = new GridBagConstraints();
        taGBC.gridwidth = 2;
        taGBC.weightx = 1.0; // Cell takes up all extra horizontal space
        taGBC.weighty = 1.0; // Cell takes up all extra vertical space
        taGBC.fill = GridBagConstraints.BOTH; // Fill cell in both direction
        taGBC.insets = new Insets(3, 3, 3, 3); // Put some space between elements for nicer look
        JTextArea textArea = new JTextArea(10, 80);
        list.add(new JScrollPane(textArea), taGBC);

        frame.pack();

        frame.setVisible(true);
    }

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

    }
}

そして結果

ここに画像の説明を入力

于 2013-04-15T13:59:07.793 に答える
1

あるコンポーネントを別のコンポーネントと並べてみjava.awt.FlowLayoutてください。

于 2013-04-15T13:16:09.737 に答える
1

BorderLayoutそれぞれに a を設定しようとすることができますJPanel p:

public static void main(String[] args) {
    JFrame frame = new JFrame("New Message");
    frame.setSize(100, 100);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTextArea textArea = new JTextArea();
    frame.add(textArea, BorderLayout.CENTER);

    JPanel list = new JPanel();
    list.setLayout(new BoxLayout(list, BoxLayout.Y_AXIS));
    frame.add(list, BorderLayout.NORTH);

    String[] labels = {"To: ", "Cc: ", "Bcc: ", "Subject: "};
    for (int i = 0; i < labels.length; i++) {
        JLabel l = new JLabel(labels[i]);
        JTextField f = new JTextField();
        JPanel p = new JPanel(new BorderLayout());
        p.add(l, BorderLayout.WEST);
        p.add(f, BorderLayout.CENTER);
        list.add(p);
    }

    frame.pack();

    frame.setVisible(true);

}
于 2013-04-15T13:24:28.657 に答える