BorderLayout не работает - PullRequest
       20

BorderLayout не работает

5 голосов
/ 30 июля 2011

Я не могу заставить BorderLayout работать.Я хочу, чтобы кнопка отмены была расположена внизу, но она не работает.Код:

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonModel;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

class Test {
    public static JFrame owner;
    public static void main(String[] args) {
        final JDialog frame = new JDialog(owner, "Test");
        frame.setLayout(new BorderLayout());
        frame.setSize(500, 300);
        final JPanel panel = new JPanel();
        final ButtonGroup group = new ButtonGroup();
        String[] options = {"1", "2", "3"};
        for (String text : options) {
            JRadioButton option = new JRadioButton(text);
            option.setActionCommand(text);
            group.add(option);
            panel.add(option);
        }
        JButton okButton = new JButton("OK");
        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ButtonModel selectedModel = group.getSelection();
                if (selectedModel != null) {
                    System.err.println(selectedModel.getActionCommand());
                }
            }
        });
        panel.add(okButton);
        JButton cancelButton = new JButton("Cancel");
        cancelButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setVisible(false);
                frame.dispose();
            }
        });
        panel.add(cancelButton, BorderLayout.SOUTH);
        frame.add(panel);
        frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
}

Ответы [ 3 ]

9 голосов
/ 30 июля 2011

Вы добавляете cancelButton на панель, используя константу BorderLayout.SOUTH:

  panel.add(cancelButton, BorderLayout.SOUTH);

Но где вы устанавливаете макет панели как BorderLayout?Поскольку вы никогда не устанавливаете макет этого контейнера, он будет использовать макет по умолчанию для JPanel, который является FlowLayout.

Решение: установите макет панели JPanel на BorderLayout, чтобы получить поведение BorderLayout.

Как только вы это решите,у вас будет другая проблема:

  for (String text : options) {
     JRadioButton option = new JRadioButton(text);
     option.setActionCommand(text);
     group.add(option);
     panel.add(option);
  }

Вы добавляете JRadioButton к той же панели JPanel, независимо от макета.Я подозреваю, что вы хотите добавить JRadioButtons к своей собственной JPanel, вероятно, которая использует GridLayout(1, 0) или GridLayout(0, 1), в зависимости от желаемой ориентации, и затем вы хотите добавить эту JPanel на панель, возможно, в позиции BorderLayout.CENTER..

Также у вас есть похожая проблема с вашим okButton в том, что вы добавляете его на панель независимо от макета.

6 голосов
/ 30 июля 2011

Вы можете попробовать изменить

panel.add(cancelButton, BorderLayout.SOUTH);

до

frame.add(cancelButton, BorderLayout.SOUTH);

Результат:

enter image description here

3 голосов
/ 30 июля 2011

Как говорит Hovercraft Full Of Eels , JPanel поведение по умолчанию - FlowLayout, которое является самым простым, и оно описано здесь .Вы можете легко изменить его на нужный вам менеджер, указав его в конструкторе:

panel = new JPanel(new BorderLayout())
...