Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中BorderLayout()的问题_Java_Swing_Jframe_Jpanel_Border Layout - Fatal编程技术网

Java中BorderLayout()的问题

Java中BorderLayout()的问题,java,swing,jframe,jpanel,border-layout,Java,Swing,Jframe,Jpanel,Border Layout,我尝试了很多不同的方法,但我将解释其中两种方法以及发生了什么(没有错误消息或任何事情,只是没有像他们应该的那样出现,或者根本没有出现): 首先,我创建了一个名为layout的JPanel,并将其设置为BorderLayout。下面是我制作它的一个片段: JPanel layout = new JPanel(); layout.setLayout(new BorderLayout()); colorChoice = new JLabel("Choose your color: "); layou

我尝试了很多不同的方法,但我将解释其中两种方法以及发生了什么(没有错误消息或任何事情,只是没有像他们应该的那样出现,或者根本没有出现):

首先,我创建了一个名为layout的JPanel,并将其设置为BorderLayout。下面是我制作它的一个片段:

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(newborderlayout());下面是该代码的一个片段:

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

    colorBox = new JComboBox(fireworkColors);
    colorBox.addActionListener(this);
    add(colorBox, BorderLayout.NORTH); 
然而,在这个场景中,它们是被添加的,宽度占据了帧的整个宽度,而文本字段(代码段中没有显示)基本上占据了其他所有内容

以下是我尝试过的: setPreferredSize()和setSize()

我还缺什么吗?多谢各位

我还应该注意,这是一个单独的类,在这个类中没有main。我之所以这样说,是因为我扩展了JPanel而不是JFrame。我见过一些人扩展JFrame并使用JFrame,但我还没有尝试过

  • 您创建了一个JPanel,但没有将其添加到任何容器中。只有将其添加到某个对象(JFrame或层次结构上某个框架中的另一个面板)后,它才会可见
  • 在BorderLayout中的同一位置添加了两个零部件。最后添加的一个将占据该位置

更新:

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

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

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);
        }
    }
在这个程序中,我创建了一个面板,但没有将其添加到任何内容中,因此它永远不会可见

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

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);
        }
    }
请注意,在这两种情况下,当我向面板添加某些内容时,我选择了不同的布局参数(一个标签我放在“北”中,另一个放在“南”)
  • 您创建了一个JPanel,但没有将其添加到任何容器中。只有将其添加到某个对象(JFrame或层次结构上某个框架中的另一个面板)后,它才会可见
  • 在BorderLayout中的同一位置添加了两个零部件。最后添加的一个将占据该位置

  • 更新:

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

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

    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);
            }
        }
    
    在这个程序中,我创建了一个面板,但没有将其添加到任何内容中,因此它永远不会可见

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

    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);
            }
        }
    

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

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

    测试 首先,在看不到所有东西的情况下,你总是可以尝试很多东西

    首先,在加载所有内容后,尝试将其添加到中(再次,假设您的扩展
    JFrame

    revalidate();
    repaint();
    
    我一直将其添加到我自己的Swing项目中,因为它会刷新和检查,以确保所有内容都在框架上

    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);
            }
        }
    
    如果这不起作用,请确保所有的
    JComponent
    都添加到
    JPanel
    ,并且只有
    JPanel
    JFrame
    上。你的
    JFrame
    无法将所有内容排序;而
    JPanel
    会这样做

    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

    以下建议是假设您的扩展
    JFrame

    测试 首先,在看不到所有东西的情况下,你总是可以尝试很多东西

    首先,在加载所有内容后,尝试将其添加到中(再次,假设您的扩展
    JFrame

    revalidate();
    repaint();
    
    我一直将其添加到我自己的Swing项目中,因为它会刷新和检查,以确保所有内容都在框架上

    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);
            }
        }
    
    如果这不起作用,请确保所有的
    JComponent
    都添加到
    JPanel
    ,并且只有
    JPanel
    JFrame
    上。你的
    JFrame
    无法将所有内容排序;而
    JPanel
    会这样做

    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
    这里是一个
    JPanel
    的例子,它有一个边框布局,在“北”添加一个带有按钮和标签的
    JPanel


    下面是一个带有边框布局的
    JPanel
    示例,该布局将带有按钮和标签的
    JPanel
    添加到“北”


    PS:不会从另一个答案中窃取,因为它也包含一个有效的建议,请尝试修复您的
    BorderLayout
    的协调。仅供参考:
    validate
    实际上不是一个解决方案,除非容器已经被
    invalidate
    ,这在添加/删除组件时通常不会发生。相反,您应该这样做使用
    revalidate
    ,但你最好有一个很好的理由;)我知道它的用途,但我不知道为什么要使用它,但由于一些愚蠢的原因,当我使用Java 1.6时,每次使用
    repaint()时
    在我的Mac电脑上,什么都不会发生。使用两者,它都可以工作…0\u 0通常的模式是调用
    invalidiate
    validate
    repaint
    。第一种模式将容器层次结构标记为“无效”并要求