MigLayout JTextArea не сжимается при использовании с linewrap=true

Если я использую 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 не сжимается, когда я снова уменьшаю окно. Я был бы очень признателен за любую помощь. Спасибо

Марсель


person Marcel Menz    schedule 19.03.2010    source источник
comment
Простое и быстрое решение вы можете найти здесь! stackoverflow.com/a/7833439/2530822   -  person TotoliciCristian    schedule 29.05.2014


Ответы (2)


Это связано с тем, что для 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);
} 
person Kaleb Pederson    schedule 29.04.2010
comment
Большое спасибо Калеб. Я также попытался поместить его в область прокрутки, которая также отлично работает. С уважением Марсель - person Marcel Menz; 01.05.2010

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

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

to

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

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

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

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

person Datoraki    schedule 16.05.2011
comment
+1 Кажется, это решает проблемы и с другими упрямыми компонентами. В моем случае рамка браузера Chrome не уменьшалась до тех пор, пока не был добавлен минимальный размер. - person Daniel Rikowski; 30.11.2011
comment
Подтверждено, это работает и намного проще в использовании, чем принятый ответ. Вы можете указать "wmin 0", что, на мой взгляд, дает понять, что добавлено для решения проблемы. +1 за ваше минимальное исправление. - person Timmos; 10.04.2014
comment
Работает отлично. В моем случае мне нужно было убедиться, что компонент имеет как минимальный размер , так и предпочтительный размер. - person FWDekker; 10.01.2020