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();
}
});