java - miglayout中的相对布局

标签 java miglayout

我正在尝试使用 Miglayout 对齐 Jpanel 上的三个按钮。 Button1 与 Jpanel 的 50% 50% 对齐,Button2 和 Button3 彼此相邻对齐 50% 80%。看起来这应该很容易,但我无法让所有按钮正确对齐。这是我的代码片段:

      panel = new JPanel();
      panel.setLayout(new MigLayout());
      this.add(panel);// add to JFrame
      JButton Button1 = new JButton("Button 1");
      Button1.setPreferredSize(new Dimension(200,70));
      JButton Button2 = new JButton("Button 2");
      Button2.setPreferredSize(new Dimension(200,70));
      JButton Button3 = new JButton("Button 3");
      Button3.setPreferredSize(new Dimension(200,70));
      panel.add(Button1, "push,align 50% 50%");
      panel.add(Button2, "split,align 50% 80%");
      panel.add(Button3, "push,align 50% 80%");
      this.setLocationRelativeTo(null);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setVisible(true);
      this.pack();

正如您在附图中看到的,水平对齐方式并不符合预期。但是,如果我仅添加 Button1 或 Button2 和 Button3,则对齐是正确的。我该如何修复它? enter image description here

最佳答案

MigLayout并不是真正设计成这样工作的。这并不是说不可能,因为有一些解决方法,但它们并不理想。

方式MigLayout工作原理是它使用网格来放置组件。当您将组件添加到使用 MigLayout 的容器时作为布局,它以水平顺序添加它们。

方式align属性的工作原理是,它尝试将该行的单元格相对于您当前所在的行和列尽可能地与您要求的位置对齐。它不允许这些单元格重叠。

这就是为什么它似乎对你不起作用,因为你试图使单元格重叠。

因此,对于您正在做的工作,您至少需要 2 行,然后计算如何相对于每行对齐组件。解决方法部分对此进行了解释。

您可以通过设置 MigLayout 来查看代码的实际情况。布局为debug模式为 new MigLayout("debug") .

你的尝试

Your Attempt

<小时/>

解决方法

您可以使用一些简单的权重结合一点数学来实现这一点。

  • 第 1 步 - 为要增长的行高指定权重。我为第一列选择了 70,为第二列选择了 30。这意味着当行获得分配的高度空间时,如果有空间,第一行将占用 70% 的空间,第二行将占用 30% 的空间。

  • 第 2 步 - 使用此权重计算出整个容器上 50% 和 80% 的垂直位置。在这种情况下,50/70 ≈ 71% 和 10/30 ≈ 33%。 (10来自80% - 70%)

  • 第 3 步 - 使用这些垂直对齐图形来排列按钮。

My Attempt

可运行示例

import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class Test {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Relative Panel");
        JPanel panel = new JPanel(new MigLayout("", "", "[grow 70][grow 30]"));

        JButton Button1 = new JButton("Button 1");
        Button1.setPreferredSize(new Dimension(200,70));
        panel.add(Button1, "push,align 50% 71%, wrap");

        JButton Button2 = new JButton("Button 2");
        Button2.setPreferredSize(new Dimension(200,70));
        panel.add(Button2, "split,align 50% 33%");

        JButton Button3 = new JButton("Button 3");
        Button3.setPreferredSize(new Dimension(200,70));
        panel.add(Button3, "push,align 50% 33%");

        frame.add(panel);
        frame.setPreferredSize(new Dimension(800, 800));
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

关于java - miglayout中的相对布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46755612/

相关文章:

java - MigLayout 行高和更改字体大小

java - MigLayout:将两个JLabel放在同一行,用JTextField分隔

java - MigLayout 中的单元格

java - 将单元格合并到 MigLayout?

java - JTextArea 中的换行导致 JScrollPane 与 MiGLayout 的行为不一致

java - 如何在java中使用NSApplication和NSWindow访问在mac中打开的窗口及其内容?

java - 无法在同一类的对象上使用方法

java - 如何从java代码添加环境变量

java - Tensorflow Java API 设置分类列的占位符

java - vector 中的 vector ... Java