Here is what I got so far. This example uses only JTextArea , but it also works with other components (like my images). The only thing he cannot do at the moment is to compose the components, as in line 3 in the figure above (one on top of the other), but this should not be a problem.
Perhaps this helps someone learn how to write their own layout manager.
import java.awt.*; import javax.swing.*; public class SwingApp extends JFrame { private static final long serialVersionUID = 1L; public static void main(final String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { final SwingApp app = new SwingApp(); } }); } private SwingApp() { setTitle(":)"); setSize(800, 450); setResizable(true); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); /*JTextArea textArea = new JTextArea("111111alks jdfksajfjsaölk jfölksajfölkjsa lkfj salkjflkdsjf ölsajfölksaj fölkjs flkjdsa flkjsaölkfjsölk");*/ //textArea.setLineWrap(true); //this.getContentPane().add(textArea); this.getContentPane().setLayout(new MyListLayoutManager()); add(20, "left ajdskfj lksajdf dsafj lkdsjflksjalkfjsalk jlksjaf salkjfjdsflkjdslkfjlks " + "flk salkfjdslkfjlkds flkjds lkfjdslkfjlkds flkjds fljlfd left", "right dksjf " + "asjfjsa jfsjföldsajföljsa ölkfjdsaölk jf0932875 0983 09584093859438 095843 " + "5lkjf lksa jf lkdsajf 923879 825094lkjtwj lkdsf27509425 right"); add(50, "left ajdskfj lksajdf dsafj lkdsjflksjalkfjsalk jlksjaf salkjfjdsflkjdslkfjlks " + "flk salkfjdslkfjlkds flkjds lkfjdslkfjlkds flkjds fljlfd left", "right dksjf " + "asjfjsa jfsjföldsajföljsa ölkfjdsaölk jf0932875 0983 09584093859438 095843 " + "5lkjf lksa jf lkdsajf 923879 825094lkjtwj lkdsf27509425 right"); add(70, "left ajdskfj lksajdf dsafj lkdsjflksjalkfjsalk jlksjaf salkjfjdsflkjdslkfjlks " + "flk salkfjdslkfjlkds flkjds lkfjdslkfjlkds flkjds fljlfd left", "right dksjf " + "asjfjsa jfsjföldsajföljsa ölkfjdsaölk jf0932875 0983 09584093859438 095843 " + "5lkjf lksa jf lkdsajf 923879 825094lkjtwj lkdsf27509425 right"); add(70, "left ajdskfj lksajdf dsafj lkdsjflksjalkfjsalk jlksjaf salkjfjdsflkjdslkfjlks " + "flk salkfjdslkfjlkds flkjds lkfjdslkfjlkds flkjds fljlfd left", "right dksjf " + "asjfjsa jfsjföldsajföljsa ölkfjdsaölk jf0932875 0983 09584093859438 095843 " + "5lkjf lksa jf lkdsajf 923879 825094lkjtwj lkdsf27509425 right"); add(70, "left ajdskfj lksajdf dsafj lkdsjflksjalkfjsalk jlksjaf salkjfjdsflkjdslkfjlks " + "flk salkfjdslkfjlkds flkjds lkfjdslkfjlkds flkjds fljlfd left", "right dksjf " + "asjfjsa jfsjföldsajföljsa ölkfjdsaölk jf0932875 0983 09584093859438 095843 " + "5lkjf lksa jf lkdsajf 923879 825094lkjtwj lkdsf27509425 right"); } private void add(final int leftPercent, final String leftText, final String rightText) { final JPanel panel = new JPanel(new MyRowLayoutManager(leftPercent)); final JTextArea left = new JTextArea(leftText); left.setLineWrap(true); final JTextArea right = new JTextArea(rightText); right.setLineWrap(true); panel.add(left); panel.add(right); this.getContentPane().add(panel); } private class MyListLayoutManager implements LayoutManager { @Override public void addLayoutComponent(final String name, final Component comp) { } @Override public void removeLayoutComponent(final Component comp) { } @Override public Dimension preferredLayoutSize(final Container parent) { return new Dimension(600, 300); } @Override public Dimension minimumLayoutSize(final Container parent) { return new Dimension(0, 0); } @Override public void layoutContainer(final Container parent) { final Dimension size = parent.getSize(); final int left = 0; int top = 0; for (int i = 0; i < parent.getComponentCount(); ++i) { final Component component = parent.getComponent(i); component.setSize(size.width, 1); final Dimension preferredSize = component.getPreferredSize(); component.setBounds(left, top, preferredSize.width, preferredSize.height); top += preferredSize.height; } } } private class MyRowLayoutManager implements LayoutManager { private final int _leftPercent; private MyRowLayoutManager(final int leftPercent) { _leftPercent = leftPercent; } @Override public void addLayoutComponent(final String name, final Component comp) { } @Override public void removeLayoutComponent(final Component comp) { } @Override public Dimension preferredLayoutSize(final Container parent) { return new Dimension(600, 300); } @Override public Dimension minimumLayoutSize(final Container parent) { return new Dimension(0, 0); } @Override public void layoutContainer(final Container parent) { if (parent.getComponentCount() != 2) { throw new RuntimeException("Supports for exact 2 components"); } final Dimension size = getSize(); final int widthForLeft = size.width * _leftPercent / 100; final int widthForRight = size.width - widthForLeft; final Component left = parent.getComponent(0); //left Component left.setSize(widthForLeft, 1); final Dimension leftDimension = left.getPreferredSize(); left.setBounds(0, 0, widthForLeft, leftDimension.height); final Component right = parent.getComponent(1); //right Component right.setSize(widthForRight, 1); final Dimension rightDimension = right.getPreferredSize(); right.setBounds(widthForLeft, 0, widthForRight, rightDimension.height); parent.setSize(size.width, Math.max(leftDimension.height, rightDimension.height)); parent.setPreferredSize(new Dimension(size.width, Math.max(leftDimension.height, rightDimension.height))); } } }
by wrapping the main method in invokeLater() you can see:

SwingUtilities.invokeLater(new Runnable() { @Override public void run() { final SwingApp app = new SwingApp(); } });