5

I am having trouble with the same thing as this guy:

MigLayout JTextArea is not shrinking when used with linewrap=true

and I used the solution described in one of the answers; to set the minimum size explicitly. This works fine if one places the JPanel which contains the JTextArea directly in a JFrame, and then resizes the window.

However, when placing the panel which contains the JTextArea inside a JScrollPane, the same problem occurs again. Why is this, and how can one fix it?

Cheers

EDIT: An example

public class MiGTest2 extends JFrame{   
public MiGTest2(){
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new JPanel(new MigLayout("fillx, debug", "[fill]"));
    JTextArea textArea  = new JTextArea();
    textArea.setLineWrap(true);
    panel.add(textArea, "wmin 10");
    //panel.add(new JTextField());
    JScrollPane scrollPane = new JScrollPane(panel);
    //add(panel);
    add(scrollPane);
    pack();
}
public static void main(String[] args){
    new MiGTest2().setVisible(true);
}
}

If you uncomment //add(panel);, and comment add(scrollPane);, shrinking the window size will also shrink the JTextArea. That is, it does not work with a JScrollPane. Also note how the layout manager seems to flip out and starts "shaking" all its contents when shrinking the size of the window after first enlarging it

Community
  • 1
  • 1
Datoraki
  • 1,223
  • 13
  • 26

4 Answers4

10

I had a very similar problem and following the answer in the mentioned question did not help me either. However, it did provide a valuable idea -- the problem is in the width of the JTextArea with wrap enabled.

What worked for me was setting both minimum and preferred width at the component level using command width. For example, width 10:500:.

Community
  • 1
  • 1
01es
  • 5,362
  • 1
  • 31
  • 40
  • This is actually the core of the answer - let MigLayout manage the size - with a twist, all JTextAreas need to be accounted for on the frame. I had a case with one not accounted for (and it was hard to tell because it was essentially functioning as a label) and this caused all JTextAreas on the panel to fail. – Yishai Nov 15 '11 at 22:44
7

I've had similar problems with JTextAreas and wrapping when used with JScrollPanes.

A solution that worked for me was to create a custom panel that implements the Scrollable interface and overrides the getScrollableTracksViewportWidth() method to return true. This forces causes the scroll pane to only scroll vertically and lets line wrapping in the JTextArea work as expected.

/**
 * A panel that, when placed in a {@link JScrollPane}, only scrolls vertically and resizes horizontally as needed.
 */
public class OnlyVerticalScrollPanel extends JPanel implements Scrollable
{
    public OnlyVerticalScrollPanel()
    {
        this(new GridLayout(0, 1));
    }

    public OnlyVerticalScrollPanel(LayoutManager lm)
    {
        super(lm);
    }

    public OnlyVerticalScrollPanel(Component comp)
    {
        this();
        add(comp);
    }

    @Override
    public Dimension getPreferredScrollableViewportSize()
    {
        return(getPreferredSize());
    }

    @Override
    public int getScrollableUnitIncrement(Rectangle visibleRect,
            int orientation, int direction)
    {
        return(10);
    }

    @Override
    public int getScrollableBlockIncrement(Rectangle visibleRect,
            int orientation, int direction)
    {
        return(100);
    }

    @Override
    public boolean getScrollableTracksViewportWidth()
    {
        return(true);
    }

    @Override
    public boolean getScrollableTracksViewportHeight()
    {
        return(false);
    }
}

and MigTest2 becomes:

public class MiGTest2 extends JFrame
{   
    public MiGTest2()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new MigLayout("fillx, debug", "[fill]"));
        JTextArea textArea  = new JTextArea();
        textArea.setLineWrap(true);
        panel.add(textArea, "wmin 10");
        //panel.add(new JTextField());

        //Wrap panel with the OnlyVerticalScrollPane to prevent horizontal scrolling
        JScrollPane scrollPane = new JScrollPane(new OnlyVerticalScrollPanel(panel));
        //add(panel);
        add(scrollPane);
        pack();
    }

    public static void main(String[] args)
    {
        new MiGTest2().setVisible(true);
    }
}
prunge
  • 22,460
  • 3
  • 73
  • 80
  • Thanks prunge, but that really doesn't work at all. I get a JTextArea inside a panel (so it is limited to one line) that does not contract when the frame is made smaller, it just is in a panel that gets a horizontal scroll bar. – Yishai Nov 15 '11 at 15:04
  • You need to set wmin as a constraint or it doesn't work. I just used this, works fine. – Chris Dennett Nov 16 '11 at 17:24
0

Normally, you would put the JTextArea into your JScrollPane. Like this:

JTextArea area = new JTextArea();
JScrollPane scroll = new JScrollPane(area);
JPanel panel = new JPanel();
panel.add(scroll);
Lukas Knuth
  • 25,449
  • 15
  • 83
  • 111
  • 2
    here are described all possible costructors for JPanels definition http://download.oracle.com/javase/6/docs/api/javax/swing/JPanel.html#JPanel%28java.awt.LayoutManager,%20boolean%29 – mKorbel May 16 '11 at 21:36
  • The constructor aside, this didn't work with the above example. Or maybe you could edit the above example so it works? I so far haven't found one single combination that works – Datoraki May 16 '11 at 22:17
  • 1
    @mKorbel Damn, i was to fast sending it. Corrected that, sorry. – Lukas Knuth May 17 '11 at 06:18
0

Not really sure what you're trying to achieve here, try running this and see if it fits your need?


public class MiGTest2 extends JFrame {
    public MiGTest2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel(new MigLayout("fillx, debug", "[fill]"));

        JTextArea textArea = new JTextArea();
        textArea.setLineWrap(true);
        panel.add(new JScrollPane(textArea), "wmin 10, grow, push");

        setLayout(new MigLayout("fill"));

        JScrollPane scrollPane = new JScrollPane(panel);
        add(scrollPane, "grow, push");

        pack();
    }

    public static void main(String[] args) {
        new MiGTest2().setVisible(true);
    }
}

Alexander Malfait
  • 2,691
  • 1
  • 23
  • 23