【问题标题】:Is there a way to insert a "cell" in MigLayout?有没有办法在 MigLayout 中插入“单元格”?
【发布时间】:2011-02-17 22:14:21
【问题描述】:

我正在尝试创建一个可以根据事件动态插入组件的面板。该面板是基于行的,每行的组件数量可变。但是,我在现有组件之间插入组件时遇到问题。

例如,如果我有以下布局(线条代表 MigLayout 单元格):

+----+----+----+  
| X1 | X2 | X3 |
+----+----+----+----+
| Y1 | Y2 | Y3 | Y4 |
+----+----+----+----+

是否可以在 X 行和 Y 行之间创建一个单元格,以获得:

+----+----+----+  
| X1 | X2 | X3 |
+----+----+----+
| Z1 |
+----+----+----+----+
| Y1 | Y2 | Y3 | Y4 |
+----+----+----+----+

我尝试了content.add(component, "cell 1 0, wrap");,但它会将组件插入到Y1 单元格中。

到目前为止,我唯一的解决方案是致电content.add(component, "wrap", index);。但是,这要求我知道前面组件的总数。

【问题讨论】:

    标签: java swing miglayout


    【解决方案1】:

    “hidemode”约束帮你:

    new MigLayout("hidemode 3","","[][][]")
    

    【讨论】:

      【解决方案2】:

      您可以在 migLayout 中为您的单元格使用“绝对”定位,而不是使用“单元格”概念,并通过引用相邻单元格的坐标将单元格粘合在一起。您需要为单元格命名以便在 migLayout 中引用它们。

      然后,您可以随时通过更改单元格坐标中的名称引用来重新排列单元格,您只需为受影响的单元格调用 setComponentConstraints(...)。

      f.i.你插入单元格Z,你

      查看 miglayout 演示应用程序。 一些代码可能如下所示:

      myPanel.add(createCell("X1"), "pos 0 0 100 100");
      myPanel.add(createCell("X2"), "pos X1.x2 0 200 X1.y2");
      

      等等。

      当你插入单元格“Z”时,

      myPanel.add(createCell("Z"), "pos 0 X1.z2 200 100");
      

      您只需要将 Y1 的 y 参考从 X1.y2 更改为 Z.y2。

      我做了某事。类似于创建一种multi-splitpane,看起来效果不错。

      【讨论】:

      • 除了重新插入单元格“Y1”之外,还有其他方法可以更新引用吗?
      【解决方案3】:

      没有直接插入新组件的方法,但是删除和重新添加所有现有组件相当简单,无需复制粘贴。其中重要的部分是原始组件布局所在的位置不必可访问,并且您不必将所有布局代码放在多个位置。

        Map<Component,Object> constraintMap = migLayout.getConstraintMap();
        Component[] allComps = jPanel.getComponents();
        jPanel.removeAll();
        for (Component c : allComps) {
          if ( condition_to_insert ) {
            jPanel.add(insertComponent, new CC());
          } 
          jPanel.add(c, constraintMap.get(c));
      
        }
        migLayout.invalidateLayout(jPanel);
      

      【讨论】:

        【解决方案4】:

        我不确定这是否是最佳解决方案,但您可以重新铺设整个容器,包括您的新组件。我认为没有办法以您想要的方式插入组件。

        希望我错了。

        但这样做的开销应该不会太大,而且用户很快就会注意到!

        【讨论】:

          【解决方案5】:

          Panels 和 Swing 组件通常并不是真正为动态重组而设计的,所以我认为 psanton 的解决方案可能是最安全和最简单的方法。在使用现有代码重新添加元素之前,您可以通过在面板上调用 removeAll() 来重用面板。

          如果您自己的使用索引的建议也有效,那么我会同意 - 跟踪模型中的前几行应该很容易实现,并且重组组件会更快一些,尽管不太可能除非你有数百个子元素,否则你会感觉到不同。

          【讨论】:

          • 我再次中继所有组件时遇到的问题是,当组件被删除并再次添加时,视图会在可滚动区域中移动。我似乎找不到可靠的方法来滚动回相同的可见边界。
          • 我发现你可以通过保存视图矩形的值来做到这一点,例如矩形 savedViewport = pane.getViewport().getViewRect();。您可以稍后通过调用 text.scrollRectToVisible(savedViewport); 再次加载它。 (在这种情况下,'text' 是一个 JTextArea,它是窗格内的组件)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多