Here is what I got so far. This example only uses JTextArea, but it works with other components as well (like my picture shows). The only thing it can't do at the moment is layout the components like in row 3 in the picture above (one on top of the other), but this should be no problem.
Maybe this helps someone to find out, how to write a custom 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 main method into invokeLater() is possible to see :

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