替代绝对布局?(Alternative to absolute layout?)

2019-09-03 19:25发布

是否有提供相同程度的控制作为布局管理器绝对定位 ? 也使得自动调整大小可能吗? 一些地方,你可以把使用相对坐标元素?

Answer 1:

GridBagLayout是Swing中的最灵活的标准布局管理器,它可以实现几乎任何你需要的,虽然远不及简单,你只要使用相对坐标如何想象(你的意思,我猜,是相对于框架0-100%尺寸)。

您可能会发现本作的官方文档GridBagLayout 这里 ,其中也有一些数字和实例。

您还可以检查出开源米格布局 ,这是更为方便的GridBagLayout ,也有点更强大。 这是所有布局管理器的母亲。



Answer 2:

在JDK中最强大的布局管理器GridBagLayout 。 然而典型的UI包含它们中的每被配置为使用不同的布局面板的组合物。 例如边界布局对于整个窗口,流动布局,它包含一组按钮,的面板GridLayoutGridBagLayout复杂零件。

您也可以像替代看看MigLayout -非常强大的工具,允许创建几乎任何你能想象图。



Answer 3:

另一种选择是使用SpringLayout中(个人而言,我喜欢的GridBagLayout)。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import static javax.swing.SpringLayout.*;

public class SpringScaleTest {
  public JComponent makeUI() {
    SpringLayout layout = new SpringLayout();
    JPanel p = new JPanel(layout);
    p.setBorder(BorderFactory.createLineBorder(Color.GREEN, 10));

    JLabel  l1 = new JLabel("label: width=90%", SwingConstants.CENTER);
    l1.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
    JButton l2 = new JButton("button: width=50%");

    Spring panelw = layout.getConstraint(WIDTH, p);

    SpringLayout.Constraints c1 = layout.getConstraints(l1);
    c1.setX(Spring.constant(0));
    c1.setY(Spring.constant(20));
    c1.setWidth(Spring.scale(panelw, 0.9f));
    p.add(l1);

    SpringLayout.Constraints c2 = layout.getConstraints(l2);
    c2.setWidth(Spring.scale(panelw, 0.5f));
    layout.putConstraint(SOUTH, l2, -20, SOUTH, p);
    layout.putConstraint(EAST,  l2, -20, EAST,  p);
    p.add(l2);

    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() { createAndShowGUI(); }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new SpringScaleTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}


文章来源: Alternative to absolute layout?