Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сколько строчек занимает строка с учетом переносов, в JTextPane 
V
    Опции темы
philips
Дата 9.4.2008, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



вобщем это требуется для реализации отображения номеров строк. 

Код

// getLineCount - возвращает количество строк в JTextPane
// lines - содержит строку с числами и переносами
// lineNumbersPane - экземпляр JTextPane где печатаются номера
private void refreshLineNumbersPane() {
    if (lineNumbersPaneVisible) {
        String lines = "";
        for (int i = 1; i < getLineCount()+1; i++) {
            lines += i+":\n";
        }
        lineNumbersPane.setText(lines);
    }
}


если будет перенос строки (т.е line wrap == true) то номера все равно будут печататься не учитывая это (без пропусков). а надо чтоб номера печатались только напротив начала линии (т.е в данном случае добавлять нужное количество '\n' в зависимости от строки с индексом i) (см рисунок)

или может кто-нибудь предложит другой способ??  smile 

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  num1.gif 10,58 Kb
PM   Вверх
dorogoyIV
Дата 10.4.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Код

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import java.io.*;

public class MyTextPane extends JTextPane implements Runnable
{
 public MyTextPane()
 {
  new Thread(this).start();
 }

 public void appendText(String text)
 {
  try
  {
   Document doc=getDocument();
   setCaretPosition(doc.getLength());
   replaceSelection(text);

   Rectangle r = modelToView(doc.getLength());
   if(r != null)
     scrollRectToVisible(r);
  }
  catch(Exception ex){}
 }

 public void run()
 {
  try
  {
   BufferedReader br=new BufferedReader(new FileReader("MyTextPane.java"));
   String s="";
   int i=1;

   while((s=br.readLine()) != null)
   {
    Thread.currentThread().sleep(200);

    appendText("   " + s + "\n");
    insertComponent(new Numbers(i + ""));
    i++;
   }
  }
  catch(Exception ex){}
 }

 public static void main(String[] args)
 {
  JFrame f = new JFrame();
  MyTextPane mtp=new MyTextPane();
  f.add(new JScrollPane(mtp));
  f.setBounds(100, 0, 200, (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight()-100);
  f.setVisible(true);
  f.setDefaultCloseOperation(3);
 }
}

class Numbers extends JLabel
{
 Numbers(String text)
 {
  setOpaque(true);
  setBackground(Color.yellow);
  setPreferredSize(new Dimension(20, 16));
  setText(text);
 }
}

PM MAIL   Вверх
philips
Дата 11.4.2008, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



это немного не то..

нужно чтоб цифры были на отдельной независимой панельке (например как оформление кода на этом форуме) и при печати текста динамически все прорисовывалось
PM   Вверх
dorogoyIV
Дата 11.4.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(philips @  11.4.2008,  20:15 Найти цитируемый пост)
это немного не то..

ну естественно!!!
то, что я написал, это всего лишь сырец.
просто показал некоторые возможности.
а дальше самому думать надо  smile 

ну если следовать моему коду, то можно повесить листенер на клавишу "ентер", и по нажатию ее делать insertComponent(...).
а что бы циферки были отдельно, можно например сделать их на другой панели...
ну в общем тебе реализовывать... , если что не получится, пиши, здесь помогут.
PM MAIL   Вверх
philips
Дата 11.4.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



ну так я же спрашивал про то как узнать сколько строчек занимает одна строка (от начала до \n) текста в текстовой области (т.к если она не помещается то происходит ее перенос)(см кортинку в первом посте). 

вот если я это узнаю мои проблемы будут решены, тем более и панелька и все остальное у мя уже есть smile

Это сообщение отредактировал(а) philips - 11.4.2008, 22:10
PM   Вверх
dorogoyIV
Дата 12.4.2008, 04:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(philips @  11.4.2008,  22:08 Найти цитируемый пост)
вот если я это узнаю мои проблемы будут решены

ну так я же и пишу:
Код

Rectangle r = modelToView(doc.getLength());

узнай Rectangle каждой строки
а эту идею подсчитать количество переносов выкинь из головы

Это сообщение отредактировал(а) dorogoyIV - 12.4.2008, 04:36
PM MAIL   Вверх
math64
Дата 12.4.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 5
Всего: 72



В RowHeaderView нужно поместить не JTextPane, а JList с высотой каждой ячейки равной высоте соответствующей строки в основной JTextPane.
PM   Вверх
dorogoyIV
Дата 12.4.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(math64 @  12.4.2008,  13:19 Найти цитируемый пост)
В RowHeaderView нужно поместить не JTextPane, а JList с высотой каждой ячейки равной высоте соответствующей строки в основной JTextPane.

 smile  ну бывает,  smile  , каждый может напиться  smile , тем более выходные  smile 

philips, не обращай внимания  smile 
PM MAIL   Вверх
math64
Дата 12.4.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 5
Всего: 72



dorogoyIV, а чем тебе моя идея не нравится?
PM   Вверх
philips
Дата 12.4.2008, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



спасибо всем за помощь!

кстати, применил JList вместо JTextPane, как предлагал math64. так что ему персональное спасибо за наводку. smile получилось давольно таки неплохо smile

Это сообщение отредактировал(а) philips - 12.4.2008, 21:50
PM   Вверх
dorogoyIV
Дата 12.4.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(philips @  12.4.2008,  21:42 Найти цитируемый пост)
кстати, применил JList вместо JTextPane

а теперь помучайся, что бы сделать например подсветку в тексте при поиске слова  smile (это ведь текстовый редактор?)
PM MAIL   Вверх
philips
Дата 13.4.2008, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



так ведь сам редактор текста состоит из JTextPane и JList. их объединяет JScrollPane (JTextPane  как JViewport, JList как RowHeaderView). вся эта система помещается на фрейм.

JList содержит номера линий.
в JTextPane печатается текст, ну и еще очень много фишек smile

math64 имел ввиду применить JList вместо второго JTextPane, в котором я держал номера линий. я так и сделал.  smile 
PM   Вверх
dorogoyIV
Дата 13.4.2008, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



 тогда smile 
только не надо писать 
Цитата

вместо второго JTextPane

у JScrollPane есть поля - "rowHeader" и "viewport"
этой писаниной вводишь в заблуждение
 smile 

Это сообщение отредактировал(а) dorogoyIV - 13.4.2008, 02:37
PM MAIL   Вверх
math64
Дата 13.4.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 5
Всего: 72



Работать непосредственно с JViewPort приходится редко - у JScrollPane есть свойство RowHeaderView, доступное через методы  getRowHeaderView/setRowHeaderView. Возможно использование RowHeaderView без get/set может кого-то запутать, но philips меня понял.
Ксати, JTextPane  будет не JViewport, а [get/set]ViewPortView, но его обычно указывают в конструкторе JScrollPane(Component view).
PM   Вверх
philips
Дата 13.4.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 6.2.2008
Где: Минск

Репутация: 1
Всего: 1



чтобы разрешить все споры, вот, что я использовал
Код

getViewport().add(editor);          // JTextPane editor
setRowHeaderView(numberList);      // JList numberList



Это сообщение отредактировал(а) philips - 13.4.2008, 14:40
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.