首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BorderLayout()在Java中的问题

BorderLayout()在Java中的问题
EN

Stack Overflow用户
提问于 2015-11-11 20:28:43
回答 3查看 962关注 0票数 0

我尝试过许多不同的方法,但我将解释两种方法以及发生了什么(没有错误消息或任何东西,只是没有显示出它们应该出现的样子,或者根本没有出现):

首先,我创建了一个名为JPanel的布局,并将其设置为BorderLayout。下面是我如何使它看起来的一个片段:

代码语言:javascript
运行
复制
JPanel layout = new JPanel();
layout.setLayout(new BorderLayout());

colorChoice = new JLabel("Choose your color: ");
layout.add(colorChoice, BorderLayout.NORTH);

colorBox = new JComboBox(fireworkColors);
colorBox.addActionListener(this);
layout.add(colorBox, BorderLayout.NORTH);

在这种情况下,它们根本不出现。它只会继续我添加的其他任何东西。

然后我尝试了setLayout(新的BorderLayout());下面是该代码的一个片段:

代码语言:javascript
运行
复制
    setLayout(new BorderLayout());
    colorChoice = new JLabel("Choose your color: ");
    add(colorChoice, BorderLayout.NORTH);

    colorBox = new JComboBox(fireworkColors);
    colorBox.addActionListener(this);
    add(colorBox, BorderLayout.NORTH); 

但是,在这个场景中,宽度占用了整个框架的宽度,而textfield (没有显示在代码片段中)基本上占用了其他所有内容。

下面是我尝试过的: setPreferredSize() & setSize()

还有什么是我遗漏的吗?谢谢。

我还应该指出,这是一个单独的类,在这个类中没有main。我这么说只是因为我扩展了JPanel而不是JFrame。我见过一些人扩展JFrame并使用JFrame,但我还没有尝试过。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-11 20:34:09

  • 您创建了一个JPanel,但没有将它添加到任何容器中。除非它被添加到某物中(一个JFrame,或另一个位于层次结构的某个框架中的面板),否则它是不可见的。
  • 您在BorderLayout中的相同位置添加了两个组件。最后一个加起来的是将占据这个位置的那个。

更新:

您不需要扩展JFrame。我从来没有这样做过,相反,我总是扩展JPanel。这使我的自定义组件更加灵活:它们可以添加到另一个面板中,也可以添加到框架中。

因此,为了演示这个问题,我将制作一个完整的、小型的程序:

代码语言:javascript
运行
复制
public class BadGui
    {
    public static void main(String[] argv)
        {
        final JFrame frame = new JFrame("Hello World");
        final JPanel panel = new JPanel();
        panel.add(new JLabel("Hello"), BorderLayout.NORTH);
        panel.add(new JLabel("World"), BorderLayout.SOUTH);
        frame.setVisible(true);
        }
    }

在这个程序中,我创建了一个面板,但是没有将它添加到任何东西中,这样它就不会变得可见。

在下一个程序中,我将通过将面板添加到框架中来修复它。

代码语言:javascript
运行
复制
public class FixedGui
    {
    public static void main(String[] argv)
        {
        final JFrame frame = new JFrame("Hello World");
        final JPanel panel = new JPanel();
        panel.add(new JLabel("Hello"), BorderLayout.NORTH);
        panel.add(new JLabel("World"), BorderLayout.SOUTH);
        frame.getContentPane().add(panel);
        frame.setVisible(true);
        }
    }

请注意,在这两种情况下,当我向面板添加一些内容时,我选择了不同的布局参数(一个标签放在'North‘中,另一个放在’South‘中)。

票数 4
EN

Stack Overflow用户

发布于 2015-11-11 21:06:20

下面是一个具有JPanel的BorderLayout示例,该示例将带有按钮和标签的JPanel添加到"North“

代码语言:javascript
运行
复制
public class Frames extends JFrame
{
    public Frames()
    {
        JPanel homePanel = new JPanel(new BorderLayout());
        JPanel northContainerPanel = new JPanel(new FlowLayout());

        JButton yourBtn = new JButton("I Do Nothing");
        JLabel yourLabel = new JLabel("I Say Stuff");

        homePanel.add(northContainerPanel, BorderLayout.NORTH);

        northContainerPanel.add(yourBtn);
        northContainerPanel.add(yourLabel);

        add(homePanel);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setTitle("Cool Stuff");
        pack();
        setVisible(true);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(Frames::new);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2015-11-11 20:35:03

下面的建议是假设您的扩展JFrame**.**是

测试

首先,在没有看到everything的情况下,您总是可以尝试大量的事情。

首先,在加载所有内容之后,尝试添加以下内容(同样,假设您的扩展 JFrame

代码语言:javascript
运行
复制
revalidate();
repaint();

我一直把它添加到我自己的Swing项目中,因为它会刷新并检查是否所有东西都在框架上。

如果这不起作用,请确保将所有的JComponent添加到JPanel中,并且只有JPanelJFrame上。JFrame无法解决所有问题;JPanel可以做到这一点。

代码语言:javascript
运行
复制
JPanel window = new JPanel();
JButton button = new JButton("Press me");    

add(window);
window.add(button); // Notice how it's the JPanel that holds my components.

不过,有一件事是,你仍然可以添加你的JMenu和什么--不是通过你的JFrame,不是你的JPanel

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33659247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档