JavaGUI:宽度适合容器的框布局?

JavaGUI:宽度适合容器的框布局?,java,swing,user-interface,resize,width,Java,Swing,User Interface,Resize,Width,我正在为一个自定义源服务器浏览器制作一个GUI,该浏览器具有改进的过滤功能 这就是我所拥有的 然而,当我 当我调整窗口大小时,我希望L4D2“过滤器面板”调整到容器的当前最大宽度。我还希望能够在一列中添加更多这样的面板,如box layout提供的 Boxlayout使面板显示在列中,但它对其宽度没有任何影响。 我想我可能需要重写过滤器面板首选的大小方法,以便它们可以检索父容器的大小,但我不确定如何做到这一点 我应该如何处理这个问题 编辑:下面是一个描述问题的示例程序 import javax.

我正在为一个自定义源服务器浏览器制作一个GUI,该浏览器具有改进的过滤功能

这就是我所拥有的

然而,当我

当我调整窗口大小时,我希望L4D2“过滤器面板”调整到容器的当前最大宽度。我还希望能够在一列中添加更多这样的面板,如box layout提供的

Boxlayout使面板显示在列中,但它对其宽度没有任何影响。 我想我可能需要重写过滤器面板首选的大小方法,以便它们可以检索父容器的大小,但我不确定如何做到这一点

我应该如何处理这个问题

编辑:下面是一个描述问题的示例程序

import javax.swing.*;
import java.awt.*;

public class guiExampleProblem {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final MyWindows wnd = new MyWindows("guiExampleProblem");
                wnd.setVisible(true);
            }
        });
    }
}

class MyWindows extends JFrame {
    public MyWindows(String text) {
        super(text);

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);        

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));        

        JPanel containerPanel1 = new JPanel();
        JPanel containerPanel2 = new JPanel();
        JPanel containerPanel3 = new JPanel();
        containerPanel1.setBackground(Color.BLACK);
        containerPanel2.setBackground(Color.RED);
        containerPanel3.setBackground(Color.GREEN); 

        mainPanel.add(containerPanel1);
        mainPanel.add(containerPanel2);
        mainPanel.add(containerPanel3);

        this.add(mainPanel);
        pack();
    }   
}

调整窗口大小时,我希望面板仅沿x轴展开,并在y轴上保持恒定高度,但在示例中,面板在x轴和y轴上都展开。

将带有BoxLayout的面板放在BorderLayout的中心-将面板放在BorderLayout东面的右侧。您没有给出希望它做什么的详细信息,也没有给出任何代码,但这可能是您想要的

-

在您的解决方案之后:在我看来,在这里使用FlowLayout是令人困惑的——它将组件一个接一个地水平布置,而您从容器的宽度获得首选大小的技巧使其行为不同。我也尽量避免在应用程序中使用布局逻辑,因此我寻找了另一种方法来实现这一点,并提出:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class guiExampleProblem2
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new Runnable()
    {
      @Override
      public void run()
      {
        final MyWindows2 wnd = new MyWindows2("guiExampleProblem2");
        wnd.setVisible(true);
      }
    });
  }
}

class MyWindows2 extends JFrame
{
  public MyWindows2(String text)
  {
    super(text);

    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));

    JPanel containerPanel1 = addContainedPanel(Color.BLACK, 60, 60, mainPanel);
    JPanel containerPanel2 = addContainedPanel(Color.RED,   60, 60, mainPanel);
    JPanel containerPanel3 = addContainedPanel(Color.GREEN, 60, 60, mainPanel);

    this.add(mainPanel, BorderLayout.NORTH);

    pack();
  }

  JPanel addContainedPanel(Color color, int width, int height, JPanel container)
  {
    JPanel panel = new JPanel();
    panel.setPreferredSize(new Dimension(width, height));
    panel.setBackground(color);
    container.add(panel);
    return panel;
  }
}

这使用了BorderLayout的北部部分,这是JFrame的默认布局,顺便说一下,它可以完成您想要的主要任务—水平拉伸。带有页面轴的BoxLayout旨在将内容从上到下进行布局,因此我认为这对读者来说比较容易混淆。无论如何,这是另一种方法,我认为它使用组件(包括布局管理器),更像它们的意图和文档。

我通过覆盖“过滤器面板”GetPreferedSize方法,获得了所需的功能,以便它们检索父容器宽度并使用它。以下是示例形式的代码:

import javax.swing.*;
import java.awt.*;

public class guiExampleProblem {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final MyWindows wnd = new MyWindows("guiExampleProblem");
                wnd.setVisible(true);
            }
        });
    }
}

class MyWindows extends JFrame {
    public MyWindows(String text) {
        super(text);

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);        

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new FlowLayout());      


        JPanel containerPanel1 = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(this.getParent().getWidth(),60);
            }
        };
        JPanel containerPanel2 = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(this.getParent().getWidth(),60);
            }
        };
        JPanel containerPanel3 = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(this.getParent().getWidth(),60);
            }
        };
        containerPanel1.setBackground(Color.BLACK);
        containerPanel2.setBackground(Color.RED);
        containerPanel3.setBackground(Color.GREEN); 

        mainPanel.add(containerPanel1);
        mainPanel.add(containerPanel2);
        mainPanel.add(containerPanel3);


        this.add(mainPanel);
        pack();
    }   
}

感谢您的回复,我已经更新了我的问题,使之更加具体。坏主意-尺码提示将根据内容和/或孩子而不是家长返回尺码。执行后者可能会产生意外的结果,甚至会挂起应用程序。由于BoxLayout尊重组件的maxSize,所以要做的是覆盖getMaxSize以返回高度的一些限制。