Позиционирование элементов в JPanel CardLayout

У меня проблемы с позиционированием элементов в JPanel. Я пытался использовать GridBagLayout, но, похоже, это не приводит к перемещению каких-либо частей компонентов графического интерфейса панели. Что я должен делать?

    panel.add(Label);
    panel.add(TextField);

    panel.add(Label);
    panel.add(JChooser);

Кажется, ничто не помогает переместить эти элементы графического интерфейса. Они просто ведут себя так, как будто они в FlowLayout. Что я должен делать? Я использую CardLayout для другой панели (эта панель содержит другие панели, подобные этой), но на этой панели мне нужно выровнять их по левому краю.

Label и TextField должны быть в одной строке, а Label и JChooser должны быть в разных строках.

Пример:

SomeLabel :  [    TextField      ]
SomeLabel :  [Chooser] 

Надеюсь, я объяснил достаточно хорошо.


person Matt    schedule 30.10.2014    source источник
comment
Чтобы быстрее получить помощь, опубликуйте MCVE (минимальный полный проверяемый пример).   -  person Andrew Thompson    schedule 30.10.2014
comment
К JChooser ДИМ JComboBox?   -  person Andrew Thompson    schedule 30.10.2014


Ответы (2)


Подробнее о размещении компонентов в контейнере и Как использовать GridBagLayout

GridBagLayout требует ограничений, которые определяют, как и где компонент будет расположен в поддерживаемой им виртуальной сетке.

Макет

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestLayout {

    public static void main(String[] args) {
        new TestLayout();
    }

    public TestLayout() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.WEST;
            gbc.insets = new Insets(4, 4, 4, 4);
            add(new JLabel("SomeLabel :"), gbc);
            gbc.gridy++;
            add(new JLabel("SomeLabel :"), gbc);

            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.anchor = GridBagConstraints.EAST;
            gbc.fill = GridBagConstraints.BOTH;
            add(new JTextField(10), gbc);
            gbc.gridy++;
            add(new JComboBox(new Object[]{"Puppies", "Kittens"}), gbc);
        }

    }

}
person MadProgrammer    schedule 30.10.2014

Для установки элементов в JPanel используйте один из LayoutManagers.

Если вы хотите освободить компоненты от местоположения.

затем используйте следующее, чтобы удалить layout.

 panel.setLayout(null); 

После этого вы можете вызвать метод setBounds, чтобы установить границы для компонента, или setLocation.

comp.setLocation(int left, int top); 

comp.setBounds(int left, int top, int width, int height); 
person Hari Gyan Vashisth    schedule 30.10.2014
comment
Избегайте использования макетов null, макеты с точностью до пикселя — это иллюзия в современном дизайне пользовательского интерфейса. Существует слишком много факторов, влияющих на размер отдельных компонентов, и ни один из них вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в основе, отказ от них приведет к бесконечным проблемам и проблемам, которые вы будете тратить все больше и больше времени, пытаясь исправить. Ознакомьтесь с разделом Почему это не одобряется использовать нулевой макет в SWING? подробнее - person MadProgrammer; 30.10.2014