2012-08-18 1 views
6

Итак, у меня есть JTextArea на JPanel (BoxLayout). У меня также есть Box filler, который заполняет остальную часть JPanel. Мне нужно, чтобы мой JTextArea начинался с однострочной высоты (я могу это сделать), а также расширяться и уменьшаться, когда это необходимо.JTextArea word wrap resizing

Word wrap включен, мне просто нужно настроить его, когда новая строка добавляется/удаляется.

Я пробовал с documentListener и getLineCount(), но он не распознает символы перевода слов.

Я хотел бы избежать беспорядка с шрифтами, если это возможно.

И, НИКАКИЕ СКАЧИВЫЕ ПАНЕЛИ. Очень важно, чтобы JTextArea отображалась полностью в любое время.

ответ

13

JTextArea имеет довольно специфический побочный эффект, при правильных условиях он может вырасти сам по себе. Я случайно наткнулся на это случайно, когда пытался создать простой текстовый редактор с двумя строками (длина ограниченных символов в строке с максимальным количеством двух строк) ...

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

I'm so smallLook at me grow

Теперь кроме того, вы можете использовать ComponentListener контролировать, когда компонент изменяет размер, если это то, что вам интересно ...

public class TestTextArea extends JFrame { 

    public TestTextArea() { 

     setLayout(new GridBagLayout()); 

     JTextArea textArea = new JTextArea(); 
     textArea.setColumns(10); 
     textArea.setRows(1); 
     textArea.setLineWrap(true); 
     textArea.setWrapStyleWord(true); 

     add(textArea); 

     setSize(200, 200); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 

     textArea.addComponentListener(new ComponentAdapter() { 

      @Override 
      public void componentResized(ComponentEvent ce) { 

       System.out.println("I've changed size"); 

      } 

     }); 

    } 


    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     new TestTextArea(); 
    } 

}