Valign JPanel не работает

Я пытаюсь выровнять JPanel по вертикали. setAlignmentY не работает должным образом. Вот что я сделал до сих пор.

import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

public class ValignJPanel {

    public static void main(String args[]) {
        JFrame frame = new JFrame("Vertical Alignment");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel1 = wrapPanel(createPanel(), Component.TOP_ALIGNMENT);
        JPanel panel2 = wrapPanel(createPanel(), Component.CENTER_ALIGNMENT);
        JPanel panel3 = wrapPanel(createPanel(), Component.BOTTOM_ALIGNMENT);

        frame.setLayout(new GridLayout(1, 3));
        frame.add(panel1);
        frame.add(panel2);
        frame.add(panel3);

        frame.setSize(400, 150);
        frame.setVisible(true);
    }

    private static JPanel wrapPanel(JPanel oldPanel, float alignment) {
        JPanel panel = new JPanel();
        oldPanel.setAlignmentY(alignment);
        panel.add(oldPanel);
        return panel;
    }

    private static JPanel createPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.add(new JLabel("Hello world"));
        panel.add(new JTextField(10));
        panel.setBorder(new LineBorder(Color.red));
        return panel;
    }
}

Я пытаюсь создать метод-оболочку, который принимает JPanel и обертывает его в соответствии с заданным выравниванием.

ИЗМЕНИТЬ (из комментария, с изображением) Я пытаюсь получить результат, который выглядит так, но вместо кнопки я хочу иметь JPanel

введите описание изображения здесь


person Tejas jain    schedule 11.03.2014    source источник
comment
Прекратите редактировать свой пост, теперь он не компилируется. Если вы собираетесь редактировать его, сначала убедитесь, что он компилируется.   -  person Paul Samsotha    schedule 11.03.2014
comment
Что именно вы пытаетесь согласовать?   -  person Paul Samsotha    schedule 11.03.2014
comment
Извините за редактирование сообщения. Я пытаюсь выровнять JPanel, который я могу получить из createPanel (). В приведенном выше примере я пытаюсь получить 3 панели JPanels, выровненные вверху, по центру и внизу.   -  person Tejas jain    schedule 11.03.2014
comment
Так вы хотите, чтобы они были неровными по горизонтали?   -  person Paul Samsotha    schedule 11.03.2014
comment
Вертикально. Первая панель вверху, вторая посередине и последняя внизу ..   -  person Tejas jain    schedule 11.03.2014
comment
эти 3 панели расположены горизонтально для сравнения.   -  person Tejas jain    schedule 11.03.2014
comment
Я пытаюсь получить результат, который выглядит примерно так, но вместо кнопки я хочу использовать JPanel www.java2s.com/Tutorial/Java/0240__Swing/XAxisAlignment.htm   -  person Tejas jain    schedule 11.03.2014
comment
См. Мой обновленный ответ. Я все еще пытаюсь выяснить ошибку.   -  person Paul Samsotha    schedule 11.03.2014


Ответы (1)


Что вам нужно сделать, так это установить макет BoxLayout для new JPanel в методе wrapPanel.

JPanel panel = new JPanel();
BoxLayout layout = new BoxLayout(panel, BoxLayout.LINE_AXIS);
panel.setLayout(layout);

Ошибка: с вашим текущим кодом. Кажется, это не работает, потому что текстовое поле растягивается. Если вы используете JButton вместо JTextFeild, вы увидите эффект. Я все еще пытаюсь понять, почему текстовое поле это делает.


ОБНОВЛЕНИЕ. Наряду с приведенным выше кодом, чтобы исправить проблему растяжения текстового поля, как ответил Camickr в этом ответ

BoxLayout - один из немногих менеджеров по компоновке, который соблюдает минимальные и максимальные размеры компонента. Поэтому, если вы хотите предотвратить растяжение панели, вы можете использовать:

panel.setMaximumSize( panel.getPreferredSize() );

Приведенный выше код - это то, что вы хотите поместить в метод createPanel.

введите описание изображения здесь

import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

public class ValignJPanel {

    public static void main(String args[]) {
        JFrame frame = new JFrame("Vertical Alignment");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel1 = wrapPanel(createPanel(), Component.TOP_ALIGNMENT);
        JPanel panel2 = wrapPanel(createPanel(), Component.CENTER_ALIGNMENT);
        JPanel panel3 = wrapPanel(createPanel(), Component.BOTTOM_ALIGNMENT);

        frame.setLayout(new GridLayout(1, 3));
        frame.add(panel1);
        frame.add(panel2);
        frame.add(panel3);
        frame.setSize(400, 150);
        frame.setVisible(true);
    }

    private static JPanel wrapPanel(JPanel oldPanel, float alignment) {
        JPanel panel = new JPanel();
        BoxLayout layout = new BoxLayout(panel, BoxLayout.LINE_AXIS);
        panel.setLayout(layout);
        oldPanel.setAlignmentY(alignment);
        panel.add(oldPanel);
        return panel;
    }

    private static JPanel createPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.add(new JLabel("Hello world"));
        panel.add(new JTextField(10));
        panel.setBorder(new LineBorder(Color.red));
        panel.setMaximumSize( panel.getPreferredSize());
        return panel;
    }
}
person Paul Samsotha    schedule 11.03.2014
comment
Большое спасибо за решение. Вчера меня не было дома. Извините за задержку с принятием ответа. - person Tejas jain; 12.03.2014