如何在BoxLayout中创建组件的全宽

时间:2015-04-10 01:14:57

标签: java swing layout-manager boxlayout

我有一个JPanel,其中列出了一组Jlabel个。我想将每个标签的宽度作为面板的大小。所以它会很宽但是文字留在左边。我使用BoxLayout列出标签。

以下是代码:

public class JavaApplication78 {
    JFrame frame;
    JPanel panel, labelsPanel;
    JLabel label;
    ArrayList<String> names = new ArrayList<String>();
    ArrayList<JLabel> labelsArray = new ArrayList<JLabel>();
    Border paddingBorder = BorderFactory.createEmptyBorder(10,10,10,10);
    Border border = BorderFactory.createLineBorder(Color.BLUE);
    JScrollPane labelsScroll;
    public JavaApplication78(){
        frame = new JFrame();
        panel = new JPanel(new BorderLayout());
        names.add(".mp3");names.add(".html");names.add(".jpeg");names.add(".mp4");names.add(".pdf");

        labelsPanel = new JPanel();
        labelsPanel.setLayout(new BoxLayout(labelsPanel, BoxLayout.PAGE_AXIS));

        labelsScroll = new JScrollPane(labelsPanel);
        for(String format : names){
            label = new JLabel(format);
            //icon
            labelsArray.add(label);
            labelsPanel.add(label);
            label.setBorder(BorderFactory.createCompoundBorder(border,paddingBorder));
        }

        panel.add(labelsScroll, BorderLayout.CENTER);
        frame.add(panel);
        frame.setSize(200, 400);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        new JavaApplication78();
    }

}

目前,我可以在每个JLabel周围设置边框。标签的高度没问题,但宽度需要与父面板一样宽。 有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您可以使用GridBagLayout ...

GridBagLayout

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;

public class JavaApplication78 {

    JFrame frame;
    JPanel panel, labelsPanel;
    JLabel label;
    ArrayList<String> names = new ArrayList<String>();
    ArrayList<JLabel> labelsArray = new ArrayList<JLabel>();
    Border paddingBorder = BorderFactory.createEmptyBorder(10, 10, 10, 10);
    Border border = BorderFactory.createLineBorder(Color.BLUE);
    JScrollPane labelsScroll;

    public JavaApplication78() {
        frame = new JFrame();
        panel = new JPanel(new BorderLayout());
        names.add(".mp3");
        names.add(".html");
        names.add(".jpeg");
        names.add(".mp4");
        names.add(".pdf");

        labelsPanel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridwidth = GridBagConstraints.REMAINDER;

        labelsScroll = new JScrollPane(labelsPanel);
        for (String format : names) {
            label = new JLabel(format);
            //icon
            labelsArray.add(label);
            labelsPanel.add(label, gbc);
            label.setBorder(BorderFactory.createCompoundBorder(border, paddingBorder));
        }

        panel.add(labelsScroll, BorderLayout.CENTER);
        frame.add(panel);
        frame.setSize(200, 400);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                new JavaApplication78();
            }
        });
    }
}

JList,但在这种情况下,我倾向于使用SwingLabs SwingX库中的VerticalLayout

答案 1 :(得分:2)

BoxLayout尊重组件的最大大小,对于JLabel,最大大小等于首选大小。

您可以覆盖getMaximumSize()方法:

label = new JLabel(format)
{
    @Override
    public Dimension getMaximumSize()
    {
        Dimension d = super.getMaximumSize();
        d.width = Integer.MAX_VALUE;
        return d;
    }
};
label.setHorizontalAlignment(JLabel.CENTER);

然后,这将允许标签水平扩展以填充面板的宽度。

或者如果您想要,可以使用Relative Layout。它的功能与BoxLayout非常相似,但有一些额外的功能。基本代码是:

RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS);
rl.setFill( true );
JPanel labelsPanel = new JPanel( rl );

答案 2 :(得分:1)

使用PreferredSizeJPanel设置父JLabel的维度:

JLabel label = new JLabel() {
   public Dimension getPreferredSize() {
       return labelsPanel.getSize();
   };
};

除非您有义务使用BoxLayout,否则按照@MadProgrammer在评论中的建议使用GridBagLayout可能会更好。

编辑:

您还可以查看MigLayout。使用它添加组件非常简单:

labelsPanel.setLayout(new MigLayout());
labelsPanel.add(label, "span") // span to take the whole row width.