5

我无法让 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);
    }
}
4

3 回答 3

9

使用 BorderLayout.SOUTH 常量将 cancelButton 添加到面板:

  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)or的 JPanel GridLayout(0, 1),具体取决于所需的方向,然后您想将此 JPanel 添加到面板中,可能位于 BorderLayout.CENTER 位置。

您的 okButton 也有类似的问题,因为您将其添加到面板而不考虑布局。

于 2011-07-30T15:24:21.323 回答
6

你可以尝试改变

panel.add(cancelButton, BorderLayout.SOUTH);

frame.add(cancelButton, BorderLayout.SOUTH);

结果:

在此处输入图像描述

于 2011-07-30T15:28:56.870 回答
3

正如Hovercraft Full Of Eels所说,JPanel默认行为是FlowLayout,这是最简单的一种,在此处进行了描述。您可以通过在构造函数中指定它来轻松地将其更改为您需要的管理器:

panel = new JPanel(new BorderLayout())
于 2011-07-30T15:28:24.417 回答