Комбинированные JTextAreas - PullRequest
1 голос
/ 11 марта 2011

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

У меня есть две отдельные 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, и я просто определяю ограничения, чтобы установить размер компонентов,Я считаю, что это лучший способ иметь фиксированные пропорции компонентов, даже после изменения размера окна. Поправьте меня, если я ошибаюсь, после нескольких часов попыток различных менеджеров LayoutManager (которые все плохие и уродливые), у меня нетлюбая мотивация думать об этом дальше).Таким образом, метод getHeight() возвращает 0 все время, потому что я никогда не устанавливал размер.

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

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

Ответы [ 2 ]

1 голос
/ 11 марта 2011

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

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

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

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

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

1 голос
/ 11 марта 2011

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

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

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

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

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

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

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

...