MigLayout JTextArea не сжимается при использовании с linewrap = true - PullRequest
9 голосов
/ 19 марта 2010

Если я использую JTextArea с MigLayout, как это:

MigLayout thisLayout = new MigLayout("", "[][grow]", "[]20[]");
   this.setLayout(thisLayout);
   {
jLabel1 = new JLabel();
this.add(jLabel1, "cell 0 0");
jLabel1.setText("jLabel1");
  }
  {
 jTextArea1 = new JTextArea();
this.add(jTextArea1, "cell 0 1 2 1,growx");
jTextArea1.setText("jTextArea1");
jTextArea1.setLineWrap(false);
   } 

, тогда JTextArea отлично растет и сжимается при изменении размера окна. Когда я устанавливаю для linewrap значение true, JTextArea не уменьшается при повторном уменьшении размера окна. Я был бы очень признателен за любую помощь. Спасибо

Marcel

Ответы [ 2 ]

18 голосов
/ 16 мая 2011

Я только что обнаружил, что это можно решить, изменив строку

this.add(jTextArea1, "cell 0 1 2 1,growx");

на

this.add(jTextArea1, "cell 0 1 2 1,growx, wmin 10");

, и никаких дополнительных панелей не требуется.Установка явного минимального размера - вот что делает трюк.

Объяснение: см. Примечание в разделе о заполнении в техническом документе MiGLayout:

http://www.migcalendar.com/miglayout/whitepaper.html

8 голосов
/ 29 апреля 2010

Это потому, что JTextArea автоматически получает минимальную ширину, установленную при каждом изменении размера. Подробности доступны на форуме MigLayout . Чтобы грубо подвести итог, создайте панель, которая содержит JTextArea и дает вам дополнительный контроль над поведением изменения размера. Вот выдержка из приведенного выше сообщения на форуме:

static class MyPanel extends JPanel implements Scrollable
{
  MyPanel(LayoutManager layout)
  {
     super(layout);
  }

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

  public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction)
  {
     return 0;
  }

  public boolean getScrollableTracksViewportHeight()
  {
     return false;
  }

  public boolean getScrollableTracksViewportWidth()
  {
     return true;
  }

  public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction)
  {
     return 0;
  }
}

Затем, где бы вы ни использовали JTextArea, используйте панель с текстовой областью:

MigLayout thisLayout = new MigLayout("", "[][grow]", "[]20[]");
this.setLayout(thisLayout);
{
    jLabel1 = new JLabel();
    this.add(jLabel1, "cell 0 0");
    jLabel1.setText("jLabel1");
}
{
    JPanel textAreaPanel = new MyPanel(new MigLayout("wrap", "[grow,fill]", "[]"));
    jTextArea1 = new JTextArea();
    textAreaPanel.add(jTextArea1);
    this.add(textAreaPanel, "cell 0 1 2 1,grow,wmin 10");
    jTextArea1.setText("jTextArea1");
    jTextArea1.setLineWrap(false);
} 
...