【问题标题】:How can I use Swing FlowLayout with fixed width?如何使用固定宽度的 Swing FlowLayout?
【发布时间】:2014-05-06 11:41:33
【问题描述】:

我正在做一个原型来展示绘画程序的一些基本功能。现在,窗口如下所示:

该窗口由一个带有垂直 BoxLayout 的面板组成,在其中,有一个自定义图像控件和另一个带有包含所有按钮的 FlowLayout 的面板。

问题是我必须指定按钮面板的高度(以 100 像素为单位)。如果我删除该行,窗口将如下所示:

但是,如果我只指定宽度,并为高度写一个 0,我会得到:

我希望布局自己确定按钮面板的正确高度。这是生成第一张图片的代码:

public void createAndShowGui(){
    JFrame.setDefaultLookAndFeelDecorated(true);

    setTitle("SimplePaint");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);

    //Main container layout.
    BoxLayout mainLayout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS);
    getContentPane().setLayout(mainLayout);

    drawingPanel = new JPanel();
    drawingPanel.setLayout(null);
    drawingPanel.setPreferredSize(new Dimension(width, height));

    TextBox editor = new TextBox();     
    drawingPanel.add(editor);
    editor.setVisible(false);

    canvasControl = new DrawableCanvas(editor);
    drawingPanel.add(canvasControl);
    canvasControl.setBounds(0, 0, width, height);

    getContentPane().add(drawingPanel);

    drawingSurface = canvasControl.getDrawingSurface();

    //Buttons layout.
    FlowLayout buttonsLayout = new FlowLayout();
    JPanel buttonsPanel = new JPanel(buttonsLayout);
    buttonsPanel.setPreferredSize(new Dimension(width, 100)); // <-- Not in this way

    //Buttons creation...

    pack();
}

提前致谢。

【问题讨论】:

  • 您可以尝试添加多个带有 flowlayout 的面板,每个面板最多四个按钮,然后将其添加到带有 gridlayout 的buttonsPanel
  • 我认为 GUI 可以更好地使用工具栏中的按钮,并且图像/自定义绘画在滚动窗格中以 GridBagLayout 为中心。为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。
  • 是的,没错。实际上,问题可以简化为:我不知道如何使 FlowLayout 垂直(而不是水平)增长,足以显示所有按钮。我是一名 .NET 开发人员,这是我第一次必须在 Java 中使用布局。在 .NET 中,问题是使用 StackPanel 垂直指定宽度来解决的。之后,只需要添加图像控件,以及另一个包含按钮的水平 StackPanel,然后瞧,按钮会逐行显示(并非全部在一行中,从而使整个窗口变宽)。
  • 提示:添加@Arvind(或重要的@)以通知此人有新评论。
  • 是的,Andrew Thompson,我试图与您一起做,但我做不到(它没有将您的用户显示为链接,所以我认为它不起作用)。不管怎样,谢谢你的建议。

标签: java swing layout layout-manager flowlayout


【解决方案1】:

不知道如何使 FlowLayout 垂直(而不是水平)增长,刚好足以显示所有按钮

FlowLayout 不这样做。

您可以使用Wrap Layout,它扩展了FlowLayout并覆盖了首选大小方法,以便组件可以自动换行。

【讨论】:

  • 我刚试过,但我有同样的问题:如果我使用 WrapLayout 而不是 FlowLayout,并且我删除了buttonsPanel.setPreferredSize(new Dimension(width, 100)),我又遇到了第二种情况。也许我的问题是我只指定了绘图面板的大小和它包含的控件的大小,但没有更多,我希望它会作为窗口宽度的限制。我从不指定窗口的宽度,因此,FlowLayout 当然会水平增长,因为它没有水平限制。但是,我怎样才能只指定窗口的宽度而不指定高度呢?
  • @AlexText,您是否尝试过我对setSize(...) 方法的建议?
  • 不,我没有尝试,因为我看到了方法签名(特别是Container 参数),我认为无论如何它都会考虑该参数的高度。但是第二次我检查了layoutSize(...) 的实现,是的,这就是我想要的。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2017-03-13
  • 2013-06-15
  • 2014-12-28
  • 2016-04-19
  • 2012-11-27
  • 2017-08-10
  • 2021-10-29
  • 2012-03-09
相关资源
最近更新 更多