Вот что я получил до сих пор.В этом примере используется только JTextArea
, но он работает и с другими компонентами (как показано на моем рисунке).Единственное, что он не может сделать в данный момент - это расположить компоненты, как показано в строке 3 на рисунке выше (один поверх другого), но это не должно быть проблемой.
Может быть, это поможет кому-тоузнайте, как написать собственный менеджер компоновки.
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)));
}
}
}
, включив основной метод в invokeLater()
, можно увидеть:
![enter image description here](https://i.stack.imgur.com/JPG7g.jpg)
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final SwingApp app = new SwingApp();
}
});