У меня были похожие проблемы с JTextAreas и переносом при использовании с JScrollPanes.
Решение, которое работало для меня, состояло в том, чтобы создать пользовательскую панель, которая реализует интерфейс Scrollable и переопределяет метод getScrollableTracksViewportWidth () для возврата true. Это приводит к тому, что область прокрутки выполняет только вертикальную прокрутку, и позволяет переносу строк в JTextArea работать, как и ожидалось.
/**
* 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);
}
}
и MigTest2 становится:
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);
}
}