Как сделать компонент полной ширины в 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. Высота меток в порядке, но ширина должна быть такой же ширины, как и родительская панель. Есть идеи ?


person Dan    schedule 10.04.2015    source источник
comment
Вы можете использовать GridBagLayout   -  person MadProgrammer    schedule 10.04.2015


Ответы (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, но в подобных случаях мне больше нравится использовать VerticalLayout из библиотеки SwingLabs SwingX.

person MadProgrammer    schedule 10.04.2015
comment
Проще, чем переопределить максимальный размер любого компонента, который вы хотите добавить на панель, +1. - person camickr; 10.04.2015

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

Это позволит этикетке расшириться по горизонтали, чтобы заполнить всю ширину панели.

Или, если хотите, вы можете использовать относительный макет. Он работает так же, как BoxLayout, но имеет несколько дополнительных функций. Основной код будет:

RelativeLayout rl = new RelativeLayout(RelativeLayout.Y_AXIS);
rl.setFill( true );
JPanel labelsPanel = new JPanel( rl );
person camickr    schedule 10.04.2015

Используйте PreferredSize, чтобы установить размер родителя JPanel для ваших JLabel:

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

Если вы не обязаны использовать BoxLayout, возможно, лучше использовать GridBagLayout, как предложил @MadProgrammer в своем комментарии.

ИЗМЕНИТЬ:

Вы также можете взглянуть на MigLayout. Добавлять компоненты с его помощью очень просто:

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