繁体   English   中英

边框布局未占用所有可用空间

[英]Border Layout not taking up all available space

我是新手,我怀疑问题与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占据了其余空间。

旁注:

  • 通过将UI初始化包装在SwingUtilities.invokeLater从EDT启动UI。
  • 最好为JTextField指定列数,为JTextArea指定行数和列数
  • 如果之后调用pack() ,则调用setSize()是没有用的。 通常,不要在任何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();
            }
        });

    }
}

结果

在此处输入图片说明

尝试使用java.awt.FlowLayout查看一个组件在另一个组件旁边。

您可以尝试在每个JPanel p上设置BorderLayout

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);

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM