package com.link_intersystems.swing; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.LayoutManager2; public class RelativeLayout extends FlowLayout implements LayoutManager2 { private static final long serialVersionUID = 3055707054782915949L; public static class RelativeConstraints { private double relativeWidth; public RelativeConstraints(double relativeWidth) { this.relativeWidth = relativeWidth; } } private RelativeWidthResizer<Component> relativeWidthResizer; public RelativeLayout() { super(FlowLayout.LEFT); relativeWidthResizer = new JComponentAwareRelativeWidthResizer( new ComponentPreferredSizeResize()); relativeWidthResizer.setFillLastComponent(false); } public boolean isFillLastComponent() { return relativeWidthResizer.isFillLastComponent(); } public void setFillLastComponent(boolean fillLastComponent) { relativeWidthResizer.setFillLastComponent(fillLastComponent); } @Override public void layoutContainer(Container parent) { super.layoutContainer(parent); relativeWidthResizer.apply(parent); super.layoutContainer(parent); } @Override public void addLayoutComponent(Component comp, Object constraints) { if (constraints instanceof RelativeConstraints) { RelativeConstraints relativeConstraints = (RelativeConstraints) constraints; relativeWidthResizer.setRelativeWidth(comp, relativeConstraints.relativeWidth); } } @Override public Dimension maximumLayoutSize(Container target) { return null; } @Override public float getLayoutAlignmentX(Container target) { return 0; } @Override public float getLayoutAlignmentY(Container target) { return 0; } @Override public void invalidateLayout(Container target) { } }