【问题标题】:Can I get multiple rows in JPanel with FlowLayout我可以在 JPanel 中使用 FlowLayout 获得多行吗
【发布时间】:2012-04-29 21:55:40
【问题描述】:

我需要类似于GridLayout 但不调整JPanel 中组件大小的解决方案。

JFrame 一切正常,但我需要将这些组件放入 JPanel 而不是 JFrame。

【问题讨论】:

  • “JFrame 一切正常,但我需要将这些组件放入 JPanel 而不是 JFrame” 因为框架和面板可能具有相同的布局管理器,所以我看不到该声明的相关性。
  • 如果您的问题已得到解答,或者不再有效,请“打勾”以选择最合适的答案,以便所有人都知道问题已得到解决。谢谢

标签: java swing jpanel layout-manager flowlayout


【解决方案1】:

我看到了两种可能适合您要求的方法:

  • 将每个组件嵌套在具有FlowLayout 的JPanel 中,这尊重组件的首选大小,如here 所示。

  • 使用JList的HORIZONTAL_WRAP或VERTICAL_WRAP方向,如图here。

【讨论】:

    【解决方案2】:

    以下链接可能会帮助您选择最适合您需要的布局。它的 Java 教程称为“布局管理器的可视化指南”,它显示了每个布局的精美图片以及它们的外观......

    http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

    否则,如果您说 GridLayout 与您需要的相似,您始终可以编写自己的 MyGridLayout 类(扩展 GridLayout)并覆盖执行自动调整大小的方法。

    【讨论】:

      【解决方案3】:

      我自己偶然发现了这个问题,尽管我认为使用 z JList 可能是一个很好的解决方案,但还有一种更简单的方法可以使用自定义的 FLowLayout,称为 WrapLayout,可在此处获得:https://tips4java.wordpress.com/2008/11/06/wrap-layout/

      我最终在我的项目中使用了它,并且效果很好。我遇到的唯一问题是当我将窗口设置为全屏模式时,布局没有正确更新。我使用了一个简单的解决方法,就是这样:

              //int targetWidth = target.getSize().width;
              int targetWidth = target.getParent().getSize().width; // FIXME: this is a hack for getting the correct size when switching between full screen modes on Mac
      

      有了这个小技巧,它就可以完美运行。

      【讨论】:

        【解决方案4】:

        只需覆盖 flowlayout 中的 preferredLayoutSize() 并将其设置为最大大小。将对齐设置为 LEADING 并将其设置为您的 JPanel。你会得到你想要的

        private FlowLayout getFlowLayout(int maximumSize)
              {
                if (flowLayout == null)
                {
                  flowLayout = new FlowLayout()
                  {
                    @Override 
                    public Dimension preferredLayoutSize(Container target)
                    {
                      Dimension dimension = super.preferredLayoutSize(target);
                      dimension.width = Math.min(maximumSize, dimension.width);
                      return dimension;
                    }
                  };
                  flowLayout.setAlignment(FlowLayout.LEADING);
                }
                return flowLayout;
              }
        

        【讨论】:

        • 我否决了它,因为它不起作用 - 不会给你一个多行 FlowLayout。
        • 代码中还有一个错字——你把宽度放在应该使用高度的地方,但即使修复了这个问题,尝试完成其余部分几乎没有任何意义,因为它不会' t 解决问题。
        • @b005t3r “代码中还有一个错字——你把宽度放在应该使用高度的地方”你能指出我在哪里使用宽度而不是高度吗?
        猜你喜欢
        • 2019-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多