Комбинированные JTextAreas

в основном это то, что я хочу сделать:

У меня есть два отдельных JTextAreas в двух отдельных JScrollPanes, и я хочу их объединить, поэтому, когда текст будет длинным для первого TextArea, его следует продолжить на втором. Но это также должно работать с прокруткой: если я прокручиваю первую TextArea, вторая должна прокручиваться вместе с ней (и наоборот). Я попытался рассчитать максимальное количество отображаемых строк, чтобы знать, сколько строк видно. Я нашел это:

public void paint(Graphics g) {   
        super.paint(g);   
        final FontMetrics fontMetrics = g.getFontMetrics();   
        // get width of any char (font is monospaced)   
        final int charWidth = fontMetrics.charWidth('M');   
        final int charHeight = fontMetrics.getHeight();   
        final int prefWidth = this.getPreferredSize().width;   
        // get height of Parent (JScrollPane)   
        final int prefHeight = this.getParent().getHeight();   

        int maxChars = prefWidth/charWidth;   
        int maxLines = prefHeight/charHeight;   
    }  

но метод getParent().getHeight() не работает, потому что я устанавливаю размер компонентов с помощью своего LayoutManager (SpringLayout, и я просто определяю ограничения для установки размера компонентов, что я считаю лучшим методом для фиксированных пропорций компонентов, даже после изменения размера окна.Поправьте меня, если я ошибаюсь, после нескольких часов попыток использования различных LayoutManagers (которые все плохие и уродливые), у меня нет мотивации думать об этом дальше). Таким образом, метод getHeight() все время возвращает 0, потому что я никогда не устанавливаю размер.

Существуют ли какие-либо другие методы для получения видимых строк TextArea, вложенных в ScrollPane? Или я совершенно не прав здесь, и это должно быть как-то по-другому?

Спасибо за помощь.


person Simiil    schedule 11.03.2011    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE (pscode.org/sscce.html).   -  person Andrew Thompson    schedule 11.03.2011


Ответы (2)


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

На самом деле вам нужно 2 просмотра одного и того же документа. Представление номер 1 покажет все символы до некоторой максимальной длины. Вид номер 2 покажет все остальное.

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

Каждый из JTextAreas будет иметь свой собственный экземпляр документа.

Вам все равно придется вручную переходить ко второму окну, когда первое заполнено (хотя вы, конечно, можете запрограммировать свою TextArea так, чтобы она делала это автоматически, когда вы достигнете MAX_LENGTH).

Я не вижу преимуществ подключения скроллеров, так как они показывают разные данные. Почему прокрутка до строки 100 в области 1 означает, что вы хотите прокрутить до строки 1100 в области 2?

А метод paint думаю не стоит трогать. Вам нужна бизнес-логика, а не графика :)

person extraneon    schedule 11.03.2011

Ваше требование не имеет для меня смысла:

поэтому, когда текст слишком длинный для первого TextArea, его следует продолжить на втором

Хорошо, скажем, создайте каждую текстовую область для отображения 10 строк. В первом вы вводите 20 строк, после чего вы переполняетесь во второй, и теперь у вас есть 1 строка.

Если я прокручиваю первую TextArea, вторая должна прокручиваться вместе с ней (и наоборот).

Как вы прокручиваете текстовую область, когда в ней всего 1 строка?

person camickr    schedule 11.03.2011