Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
0 / 0 / 1
Регистрация: 12.08.2009
Сообщений: 145

JTextPane и проблемы с атрибутами текста

15.08.2011, 09:31. Показов 4503. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Написал свой редактор формул. Использую JtextPane и новый StyledDocument. Есть зарезервированные слова (функции и переменные). Все красится как в IDEA. Но проблемы в том что когда текст состоит скажем из 1500 строк то при открытии редактора все зависает на 1 мин.
Раскрасу я делаю путем поиска слов и контроля их.
Java
1
2
3
   word_s = Utilities.getNextWord(editor, word_s);
   word_e = Utilities.getWordEnd(editor, word_s);
   String txt = getText(word_s, word_e - word_s);
Вот маленький пример того как я делаю поиск.

Хочу спросить может есть другой альтернативный путь?
Есть идеи?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.08.2011, 09:31
Ответы с готовыми решениями:

Ловить изменение текста в JTextPane
Пишу программу блокнот. Для отбражния/редактирования текста использую JTextPane. Как у него ловить событие изменения текста? Пробовал...

Запретить редактирование текста в JTextPane
Здравствуйте! Какой метод запрещает редактирование текста в JTextPane? Что бы можно было только выделять, но не вводить/удалять.

Смена кодировки текста в JTextPane
Как в JTextPane сменить кодировку текста?

16
1 / 1 / 1
Регистрация: 07.03.2011
Сообщений: 117
15.08.2011, 10:47
Можно попробовать использовать регулярные выражения. Но даст ли это прирост в скорости, не знаю.
0
kettler
15.08.2011, 13:15
Конечно так будет очень долго просматривать каждый раз весь техст и на каждое слово вызывать фукцию редактирования.

Попробуй использовать встроенные возможности JTextPane.
Например, он ведь понимает HTML разметку и если ты свои ключевые слова свяжешь с таблицей стилей, то они будут подкрашиваться или выделяться как ты захочешь.
0 / 0 / 1
Регистрация: 12.08.2009
Сообщений: 145
15.08.2011, 13:23  [ТС]
а поподробнее.. если можеш... плиззз
0
0 / 0 / 1
Регистрация: 12.08.2009
Сообщений: 145
15.08.2011, 15:01  [ТС]
класную вещь нашел люди...
хотя не по теме но ОЧЕНЬ полезная..
с помощью её можно создать свой редактор кодов с зарезервироваными словами.. плюс можно делать коменты.. коменты красятся в серый цвет..
если надо могу дать ссылку
0
3 / 3 / 7
Регистрация: 19.10.2009
Сообщений: 225
15.08.2011, 19:13
При загрузке данных создаешь объект класса DefaultStyledDocument и в него добавляешь все слова с соответствующими стилями. А потом подключаешь этот документ к своему TextPane. Работает намного быстрее.
0
0 / 0 / 1
Регистрация: 12.08.2009
Сообщений: 145
16.08.2011, 08:10  [ТС]
ТО КорешДроу...

Ведь чтобы добавить нужно сперва найти это слово в тексте. А потом уже применять на него стиль. Не такли?
Или же есть метод прикотором сперва перед тем как передать текст в StyledDocument можно создать список зарезервированных слов после чего StyledDocuemnt сам найдет и сам раскрасить эти слова?
0
3 / 3 / 7
Регистрация: 19.10.2009
Сообщений: 225
16.08.2011, 14:36
Ну вот тебе очень простенький пример:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import java.io.*;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;
 
class Colorer extends JFrame
{
    private static final String[] RESERVED_WORDS =
      {
          'class', 'extends', 'public', 'static', 'final', 'private', 'protected', 'try', 'catch',
          'return', 'while', 'if', 'else', 'new', 'void', 'import'
      };
 
    private Colorer()
    {
        Arrays.sort(RESERVED_WORDS);
 
        JTextPane textPane = new JTextPane();
        textPane.setDocument(load('Colorer.java'));
        getContentPane().add(new JScrollPane(textPane));
 
        setSize(640, 480);
        setExtendedState(MAXIMIZED_BOTH);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }
 
    private DefaultStyledDocument load(String path)
    {
        DefaultStyledDocument document = new DefaultStyledDocument();
 
        MutableAttributeSet
          simpleStyle = new SimpleAttributeSet(),
          reservedWordStyle = new SimpleAttributeSet();
 
        StyleConstants.setBold(reservedWordStyle, true);
        StyleConstants.setForeground(reservedWordStyle, Color.BLUE);
 
        try
        {
            StringBuffer buffer = new StringBuffer();
            InputStreamReader reader = new InputStreamReader(new FileInputStream(path));
 
            int c;
            while((c = reader.read())!=-1)
            {
                if(!Character.isLetter(c))
                {
                    if(buffer.length()>0)
                    {
                        String token = buffer.toString();
                        buffer.setLength(0);
 
                        if(Arrays.binarySearch(RESERVED_WORDS, token)>=0)
                        {
                            document.insertString(document.getLength(), token, reservedWordStyle);
                        }
                        else
                        {
                            document.insertString(document.getLength(), token, simpleStyle);
                        }
                    }
 
                    document.insertString(document.getLength(), Character.toString((char) c), simpleStyle);
                }
                else
                {
                    buffer.append((char) c);
                }
            }
 
            if(buffer.length()>0)
            {
                String token = buffer.toString();
                buffer.setLength(0);
 
                if(Arrays.binarySearch(RESERVED_WORDS, token)>=0)
                {
                    document.insertString(document.getLength(), token, reservedWordStyle);
                }
                else
                {
                    document.insertString(document.getLength(), token, simpleStyle);
                }
            }
        }
        catch(Exception e)
        {
            e.printStackTrace(System.err);
        }
 
        return document;
    }
 
    public static void main(String[] arg)
    {
        new Colorer();
    }
}
0
0 / 0 / 1
Регистрация: 12.08.2009
Сообщений: 145
16.08.2011, 14:44  [ТС]
спасиб тебе КорешДроу..
Но проблема в том что в файле например 1500 строк.. то это дело занимает около 1 мин.
например я нашел другой вариант
http://www.discoverteenergy.com/files/SyntaxDocument.java
но тоже занимает такое время..
у меня уже есть свой механизм... просто хотел спросить может без поиска можно было обойтись....
а так всем спасибо за помощь!
0
1 / 1 / 3
Регистрация: 03.08.2008
Сообщений: 390
16.08.2011, 15:30
JEdit не пробовал ?
0
0 / 0 / 1
Регистрация: 12.08.2009
Сообщений: 145
16.08.2011, 15:31  [ТС]
а что это?
0
freem
16.08.2011, 15:32
А ещё наверно можно руками распарсить...наверняка быстрее будет...
я имею в виду конечные аутоматы...
0 / 0 / 1
Регистрация: 12.08.2009
Сообщений: 145
16.08.2011, 16:06  [ТС]
распаристь руками??? и как это будет выглядеть...
опиши...??
0
freem
16.08.2011, 16:33
Ну как, как...тебе что нужно ? ключевые слова подсветить ?
Ну вот...есть такая штука конечный автомат...я недавно кстати тут по этому вопросу вопрошал...
ну и всё...используя конечный автомат..за один перебор всего текста посимвольно ты можешь его....эээ...да что угодно его можешь...можешь раскрасить можешь выполнить....

Вот тут примерчик есть...разбор HTML
ну и когда сможешь выделить конкретный токен, можешь его т подсветить

http://rsdn.ru/article/alg/statemachine.xml
0 / 0 / 1
Регистрация: 12.08.2009
Сообщений: 145
16.08.2011, 16:47  [ТС]
и ещё.. забыл сказать.. что весь механизм должен работать не только при первом открытии но и во время редактирования...
как например в идеи..
у меня типа так
$Myvar.getAttr('Подписант.должность')
тут $Myvar должет маркироватся стилем для переменных
а getAttr стилем для функций

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

как я понял freem твой вариант работает только при открытии... те парсит один раз... не так ли?
0
freem
16.08.2011, 16:54
Правильно ты понял...
но это просто обший пример...
никто не мешает тебе засунуть это дело в нить/процес/поток
и парсить всё сколько угодно...скорость столь больших формул думаю позволит....Это если в лоб...

А так можно придумать что нибудь, например отслеживать изменения и парсить тока изменившийс кусок...но это уж кто на что горазд...

Я просто предложил как вариант...
freem
16.08.2011, 16:55
>> скорость столь больших формул думаю позволит....
я имел ввиду скорость печати... мол печатать медленно будет...

Ёпть, раньше буквы выпадали, сейчас целые слова...неужто старость ?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.08.2011, 16:55
Помогаю со студенческими работами здесь

Вывод текста jTextPane с html
Есть код, который создает окно, в нем место для текста, и кнопка, при нажатии которой должен выполнятся вывод текста с использованием html,...

Как вернуть фокус в начало текста в JTextPane?
После вывода текста в JTextPane, необходимо вернуть фокус в начало текста, а потом переместить фокус на кнопку. Чтобы долго не объяснять,...

Как отследить событие ввода текста в jTextPane?
Здравствуйте. Как отследить событие ввода текста в jTextPane? P.S. И заодно как запретить ввод текста туда? Спасибо

JEditorPane: сохранение текста вместе с атрибутами
Мне нужен простой текстовый редактор с минимальными возможностями задания атрибутов - установка цвета шрифта, размера и т.п. Никак не...

Добавление текста в RichTextBox с различными атрибутами
Всем здравствуйте. Как из кода занести в одно и тоже RichTextBox одну строчку со шрифтом синего цвета, а следующую со шрифтом красного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru