【问题标题】:BorderLayout not working边框布局不起作用
【发布时间】:2011-07-30 15:22:16
【问题描述】:

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

【问题讨论】:

    标签: swing layout-manager border-layout java


    【解决方案1】:

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

    您的 okButton 也存在类似问题,即您将其添加到面板而不考虑布局。

    【讨论】:

    • @jack:谢谢,但你没有“偷”任何东西。赞成票也是如此。 ;)
    【解决方案2】:

    你可以尝试改变

    panel.add(cancelButton, BorderLayout.SOUTH);
    

    frame.add(cancelButton, BorderLayout.SOUTH);
    

    结果:

    【讨论】:

    • @Tyilo:这是一个有效的答案,1+。如果这不能满足您的要求,那么您应该发布您希望 GUI 看起来像 user802421 所做的图像。
    • 喜欢屏幕截图!有关制作更好的一些技巧,请参阅How do I create a screenshot to illustrate a post?
    【解决方案3】:

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

    panel = new JPanel(new BorderLayout())
    

    【讨论】:

    • -1,由于 Hovercraft 已经提到 FlowLayout 是默认设置,因此不需要重复的答案。如果你想强调这一点,你可以在他的回答中发表评论。
    • 其实他并没有说明,他将其添加为编辑。我应该先入为主吗? :)
    • 什么?您以“正如气垫船所说...”开始您的回答,因此评论显然在那里,如果您需要更多确认,请单击“已编辑”标签旁边的链接并滚动到底部,您将在其中找到原始帖子FlowLayout 评论没有改变
    • 是的,因为我给了他所说的“快速解决方案”sn-p。而且我还明确指出,我并没有试图从任何人那里窃取任何东西。我的意思是,那里有很多不礼貌的用户,我总是试图变得有用,不要到处看到邪恶的行为:/ 我会删除这个,如果它伤害了你。无论如何,根据 Flow Layout,您是对的,我第一次回答时根本没有注意到它..您确定编辑跟踪器在第一次回答后几分钟内也可以快速编辑吗?因为我确定它没有写在那里。
    • 再次,你说“我给了他所说的快速解决方案 sn-p”,这意味着答案没有被编辑。发帖人已经知道如何使用 BorderLayout,因为第二行代码设置了布局。如果您回答的要点是您可以在构造函数中设置布局,那么也可以将其作为注释添加到原始答案中。
    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多