2014-11-03 2 views
1

Я ищу способ сделать следующее:Качели: автоматическое изменение размера текста над кнопкой?

Имейте JDialog с фиксированной шириной.

В нем есть JTextArea (или то, что вы предлагаете лучший компонент ...), который получает текст различной длины (где-то между 0 и 30 линия)

Ниже этого текста есть кнопка.

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

Самое близкое, что я пришел к решению, это, но JTextArea, похоже, не знает, насколько велико это после того, как автоматическая линия разрывается!

public PleaseResize(){ 
    super(); 

    Container cp = this.getContentPane(); 
    cp.setLayout(new BoxLayout(cp, BoxLayout.Y_AXIS)); 

    JTextArea area = new JTextArea(); 

    area.setColumns(20); 
    area.setLineWrap(true); 
    area.setEditable(false); 
    area.setWrapStyleWord(true); 
    area.setText("Once upon a midnight dreary, while I pondered, weak and weary, over many a quaint an curious volume of forgotten lore."); 


    cp.add(area); 

    cp.add(new JButton("Hallo")); 


    this.pack(); 

} 

Прокрутка текста, к сожалению не вариант.

Я спросил об этом несколько иначе: Resize Dialog properly after automatic LineWrap, но, возможно, JTextArea - это не тот компонент в конце концов? Я использую неправильный LayoutManager? Все они, похоже, не могут определить, насколько велика будет диалог. Почему JTextArea не может передать свою высоту после добавления строк в текст наружу?


Вот рабочий код:

public PleaseResize() throws BadLocationException { 
    super(); 

    Container cp = this.getContentPane(); 
    cp.setLayout(new BorderLayout()); 

    JTextArea area = new JTextArea(); 
    area.setColumns(20); 
    area.setLineWrap(true); 
    area.setEditable(false); 
    area.setWrapStyleWord(true); 
    area.setText("Once upon a midnight dreary, while I pondered, weak and weary, over many a quaint an curious volume of forgotten lore."); 
    System.out.println(area.getLineCount()); 

    JScrollPane pane = new JScrollPane(area); 
    cp.add(pane, BorderLayout.CENTER); 
    cp.add(new JButton("Hallo"), BorderLayout.SOUTH); 

    this.pack(); 
    this.pack(); 


} 

Упаковка дважды по-прежнему кажется немного странным для меня, но это не решает проблемы изменения размера :).

+0

Я мисс там JScrollPane, отдых в Oracle тащит, как использовать JTextArea/JScrollPane – mKorbel

+0

Используйте осведомленный компонент и CSS HTML, чтобы ограничить ширину. Компонент будет таким же высоким, каким он должен быть. См. [Этот ответ] (http://stackoverflow.com/a/5767825/418556) для демонстрации. –

+0

Я просто серьезно сомневаюсь в моем здравом рассудке: как показывает фиксированный код выше, код Ezequiel, похоже, ничего не делает, поскольку он работает только с вызовом pack() TWICE, а не один раз ... это ошибка Java, что-то Я должен технически не делать, или как это работает? – Layna

ответ

3

Попробуйте это aproach, чтобы изменить размер JTextArea, основанный в его модели.

 Rectangle modelToView = area.modelToView(area.getDocument().getLength()); 
     if (modelToView != null) { 
      area.setSize(area.getWidth(), Math.max(area.getHeight(), modelToView.height + modelToView.y)); 
      area.doLayout(); 
     } 
+0

Это выглядит многообещающим, но я получаю null для метода modelToView. Состояние Javadoc утверждает, что «макет не может быть вычислен до тех пор, пока компонент не будет иметь размер». Я подозреваю, что это может быть проблемой, но разве это не толкает меня к исходной проблеме: выяснить, какой размер JTextArea? – Layna

+0

Попробуйте использовать эти строки после упаковки jframe. – Ezequiel

+0

Теперь это работает ... ключ должен был упаковать(), ТОГДА используйте код, а затем упакуйте AGAIN. Так много упаковки, но она работает сейчас! Благодаря :) – Layna

Смежные вопросы