【问题标题】:Alternative to absolute layout?替代绝对布局?
【发布时间】:2013-05-11 18:59:56
【问题描述】:

是否有一个布局管理器可以提供与Absolute Positioning 相同程度的控制? 但也使自动调整大小成为可能?可以使用相对坐标放置元素的东西?

【问题讨论】:

  • 永远不要只为整个应用程序使用一个 LayoutManager,没有替代嵌套布局,不是真正的 LayoutManager,而是关于将一​​个容器拆分为具有不同但具有相同 LayoutManager 的几个容器的逻辑太

标签: java swing layout-manager


【解决方案1】:

另一种选择是使用 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);
  }
}

【讨论】:

    【解决方案2】:

    JDK 中最强大的布局管理器是GridBagLayout。然而,典型的 UI 包含面板的组合,每个面板都配置为使用不同的布局。例如整个窗口的边框布局,包含一组按钮的面板的流式布局,GridLayoutGridBagLayout 用于复杂部分。

    您还可以查看MigLayout 之类的替代方案 - 非常强大的工具,几乎可以创建您可以想象的任何视图。

    【讨论】:

      【解决方案3】:

      GridBagLayout 是 Swing 中最灵活的标准布局管理器,它几乎可以实现你需要的任何东西,尽管远没有你想象的那么简单,只使用相对坐标(我猜你的意思是 0-100 % 相对于帧大小)。

      你可以找到GridBagLayouthere的官方文档,里面也有一些图和例子。

      您也可以查看开源的MiG Layout,它比GridBagLayout 更方便,也更强大一些。它是所有布局管理器之母。

      【讨论】:

      • GridBagLayout 用法和示例可以在here 找到。
      猜你喜欢
      • 1970-01-01
      • 2011-09-18
      • 2013-11-09
      • 1970-01-01
      • 2017-01-03
      • 2018-01-22
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多