JTextarea с динамической длиной текста и переносом в BoxLayout неправильной высоты - PullRequest
0 голосов
/ 29 августа 2011

Я пытаюсь иметь многострочные метки и метки изображений в вертикальном BoxLayout.Для многострочных меток я использую JTextArea с setEditable (false).Для меток изображений я использую JLabel ([ImageIcon]).

Следующий код показывает, что текстовая область имеет много места под ней, и я этого не хочу.Для простоты я добавил текстовые метки вместо меток изображений.

Мне нужно сложить текстовую область и метки сверху вниз.После каждой текстовой области метка должна следовать непосредственно ниже, а после последней метки должно быть пустое пространство до нижней части окна.

Возможно, лучше использовать другой менеджер макетов, но я думаю, что это проблема JTextArea.Любое решение поможет.

Спасибо.

вот скомпилированный код:

import java.awt.Color;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;

public class BoxLay extends JFrame
{
private static final long serialVersionUID = 1L;

public static void main(final String[] args)
{
    new BoxLay();

}

private BoxLay()
{
    setTitle("BoxLayout TestDummy");
    setSize(800, 450);
    setResizable(true);
    setVisible(true);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));

    final JTextArea area1 = new JTextArea();
    area1.setText("First Text - Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... ");
    area1.setLineWrap(true);
    area1.setWrapStyleWord(true);
    area1.setEditable(false);
    area1.setBackground(Color.RED);
    this.add(area1);

    final JLabel label1 = new JLabel("DIRECTLY BELOW FIRST TEXT");
    this.add(label1);

    final JTextArea area2 = new JTextArea();
    area2.setText("Second Text - Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... Dynamic text of any length... ");
    area2.setLineWrap(true);
    area2.setWrapStyleWord(true);
    area2.setEditable(false);
    area2.setBackground(Color.RED);
    this.add(area2);

    final JLabel label2 = new JLabel("DIRECTLY BELOW SECOND TEXT");
    this.add(label2);

    this.add(Box.createVerticalGlue());

    this.getContentPane().invalidate();
    this.getContentPane().validate();

}
}

1 Ответ

0 голосов
/ 05 сентября 2011

Наконец-то написал свой собственный LayoutManager (dejavu!). Он просто складывает компоненты сверху вниз и не пытается подогнать их под весь экран. Это прототип, хотя X_AXIS не поддерживается. Возможно, многое можно улучшить, но, возможно, это кому-то поможет. Я также был бы очень рад, если бы кто-то смог улучшить его и поделиться им со мной, потому что я все еще новичок в работе с LayoutManager.

В любом случае, вот код:

public class StackLayout implements LayoutManager

{

static final int  X_AXIS = 0;
static final int  Y_AXIS = 1;

private final int axis   = Y_AXIS;

public void addLayoutComponent(final String name, final Component comp)
{

}

public void removeLayoutComponent(final Component comp)
{

}

public Dimension preferredLayoutSize(final Container parent)
{

    return new Dimension(200, 200);

}

public Dimension minimumLayoutSize(final Container parent)
{

    return new Dimension(0, 0);

}

public void layoutContainer(final Container parent)
{
    //TODO implement x axis layout

    final Dimension size = parent.getSize();
    if (axis == Y_AXIS)
    {

        final int left = 0;

        int top = 0;

        for (int i = 0; i < parent.getComponentCount(); ++i)
        {
            final Component component = parent.getComponent(i);

            component.setSize(parent.getSize().width, 1);

            final Dimension preferredSize = component.getPreferredSize();

            component.setBounds(left, top, Math.max(preferredSize.width, parent.getSize().width), preferredSize.height);

            top += preferredSize.height;
        }
        parent.setPreferredSize(new Dimension(parent.getSize().width, top));
    }

}

}

...