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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> событие вставки текста 
:(
    Опции темы
Leopard25
Дата 16.12.2004, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



как перехватить событие вставки текста в JTextPane ?
--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
Domestic Cat
Дата 16.12.2004, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Код

myTextPAne.getDocument().addDocumentListener(new MyDocumentListener());

...

class MyDocumentListener implements DocumentListener
{
    public void insertUpdate(DocumentEvent e) {
    ....
    }
    ....
}



--------------------

PM   Вверх
Leopard25
Дата 18.12.2004, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

запускать процедуру выделения из insertUpdate неполучается потомучто setCharacterAttributes выдаёт ошибку.

Всё работает правильно во всех случаях кроме того когда Сtrl+V или
Shift+Ins остаются долго нажатыми и происходит многократная вставка текста.

Как это исправить ?
Как отменить повторную вставку?
--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
Domestic Cat
Дата 18.12.2004, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



НИспользовать keyReleased, по-моему, необязательно, ведь в DocumentEvent есть getOffset, getLength - начало и длина вставки. По идее ничто не должно мешать вызывать setCharacterAttributes в insertUpdate, может код покажешь?


--------------------

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


Бывалый
*


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

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



Я могу показать код , но он очень большой...... показывать ?


когда в insertUpdate определял начало и конец текста то при вызове:

StyledDocument m_doc;
m_doc=this.getStyledDocument();//это правильно

m_doc.setCharacterAttributes(start, (end-start),this.getStyle("def"), true);
// здесь пишет ошибку (видимо обращаюсь за пределы текста)

а когда нахожу конец текста через keyReleased
pos2=m_SourceTextPane.getCaretPosition();
всё работает правильно

--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
Domestic Cat
Дата 18.12.2004, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



А как ты старт и енд находишь?


--------------------

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


Бывалый
*


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

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



вот так:

Код

public void keyReleased(java.awt.event.KeyEvent e) {  
int start,end;
int pos,pos2,ppos;
start=-1;
end=-1;
StyledDocument doc = m_SourceTextPane.getStyledDocument();
pos=0; // начальная позиция распознавания
pos2=0; // конечная позиция распознавания
if(m_bKeyCTRL_V==true)
     {  
      pos=m_start;
      pos2=m_SourceTextPane.getCaretPosition();  
      // поиск начала
      if ((pos-2)>=0)
       ppos=pos-2;
      else
       ppos=0;
     
      while (start<0)
      {
       try
       {  
        String spr1;
        spr1=" ";
          if (ppos>0)    spr1 = doc.getText(ppos-1,1);    
        if ( (ppos==0)
         ||(doc.getText(ppos-1,1).codePointAt(0)==32)||(doc.getText(ppos-1,1).codePointAt(0)==10)
         ||(spr1.equals("{"))||(spr1.equals("}") )
         ||(spr1.equals("("))||(spr1.equals(")") )
         ||(spr1.equals("["))||(spr1.equals("]") )
         ||(spr1.equals(","))||(spr1.equals(";") )
         ||(spr1.equals("+"))||(spr1.equals("-") )
         ||(spr1.equals("*"))||(spr1.equals("/") )
         ||(spr1.equals("^"))||(spr1.equals("'") )
         ||(spr1.equals("<"))||(spr1.equals(">") )
         ||(spr1.equals("="))||(spr1.equals("&") )
         ||(spr1.equals("?"))||(spr1.equals("\"") )
         ||(spr1.equals("~"))||(spr1.equals("#") )
         ||(spr1.equals("@"))||(spr1.equals("!") )
         ||(spr1.equals("$"))||(spr1.equals("%") )
         ||(spr1.equals("|"))||(spr1.equals("\\") )  )
        {
         start = ppos;        
        }
        ppos=ppos-1;
       }              
       catch (BadLocationException ble)
       {
          ble.printStackTrace();
       }
      }
           
      //поиск конца
      if ((pos2+2)<=doc.getLength())
      {
       ppos=pos2+2;    
      }
      else
      {
       ppos=doc.getLength();
      }
     
      String  spr2;
      spr2=" ";
     
     
      while (end<0)
      {
       try
       {
        spr2 = doc.getText(ppos,1);
        if (((doc.getText(ppos,1).codePointAt(0)==32)||(doc.getText(ppos,1).codePointAt(0)==10) || (ppos==doc.getLength())
          ||(spr2.equals("{"))||(spr2.equals("}") )
          ||(spr2.equals("("))||(spr2.equals(")") )
          ||(spr2.equals("["))||(spr2.equals("]") )
          ||(spr2.equals(","))||(spr2.equals(";") )
          ||(spr2.equals("+"))||(spr2.equals("-") )
          ||(spr2.equals("*"))||(spr2.equals("/") )
          ||(spr2.equals("^"))||(spr2.equals("'") )
          ||(spr2.equals("<"))||(spr2.equals(">") )
          ||(spr2.equals("="))||(spr2.equals("&") )
          ||(spr2.equals("?"))||(spr2.equals("\"") )
          ||(spr2.equals("~"))||(spr2.equals("#") )
          ||(spr2.equals("@"))||(spr2.equals("!") )
          ||(spr2.equals("$"))||(spr2.equals("%") )
          ||(spr2.equals("|"))||(spr2.equals("\\") ) ))
        {
         end = ppos;        
        }
        ppos++;
       }              
       catch (BadLocationException ble)
       {
          ble.printStackTrace();
       }
      }
     
      m_SourceTextPane.Sintaksis(start,end);
     }
     m_bKeyCTRL_V=false;
     
     
    }


Код

public void insertUpdate(DocumentEvent arg0) {
 
 if (m_bKeyCTRL_V==false)
 {
  m_bKeyCTRL_V=true;
        m_start = m_SourceTextPane.getCaretPosition();
       System.out.println(" m_start=  "+m_start);
 }

}


Это работает уже как надо , но как не использовать keyReleased ?

Это сообщение отредактировал(а) Domestic Cat - 18.12.2004, 21:59
--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
Leopard25
Дата 18.12.2004, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Когда пытался делать всё через insertUpdate :
вводил один символ , в Sintaksis(start,end);
передовалось start=0 end=1
и m_doc.setCharacterAttributes(start, (end-start),this.getStyle("def"), true); выдавало ошибку....
--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
Domestic Cat
Дата 18.12.2004, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата(Leopard25 @ 18.12.2004, 11:37)

Это работает уже как надо , но как не использовать keyReleased ?


Перекинуть все в отдельный метод и вызывать его.


Цитата(Leopard25 @ 18.12.2004, 11:52)
и m_doc.setCharacterAttributes(start, (end-start),this.getStyle("def"), true); выдавало ошибку....


А какую?


--------------------

PM   Вверх
Leopard25
Дата 19.12.2004, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



m_doc.setCharacterAttributes(start, (end-start),this.getStyle("def"), true); находится в отдельном методе и когда я вызываю его из insertUpdate
появляется ошибка



Появляется вот это:


Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Attempt to mutate in notification
at javax.swing.text.AbstractDocument.writeLock(Unknown Source)
at javax.swing.text.DefaultStyledDocument.setCharacterAttributes(Unknown Source)
at editor.MyJTextPane.Sintaksis(MyJTextPane.java:68)
at editor.MainFrame$MyDocumentListener.insertUpdate(MainFrame.java:146)
at javax.swing.text.AbstractDocument.fireInsertUpdate(Unknown Source)
at javax.swing.text.AbstractDocument.handleInsertString(Unknown Source)
at javax.swing.text.AbstractDocument.insertString(Unknown Source)
at javax.swing.text.AbstractDocument.replace(Unknown Source)
at javax.swing.JTextPane.replaceSelection(Unknown Source)
at javax.swing.JTextPane.replaceSelection(Unknown Source)
at javax.swing.text.DefaultEditorKit$DefaultKeyTypedAction.actionPerformed(Unknown Source)
at javax.swing.SwingUtilities.notifyAction(Unknown Source)
at javax.swing.JComponent.processKeyBinding(Unknown Source)
at javax.swing.JComponent.processKeyBindings(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
Domestic Cat
Дата 19.12.2004, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Дурак я, забыл smile Это значит, что пока происходит модификация документа (инсерт),он заблокирован и любая попытка его изменить из листенера должна приводить к IllegalStateException. Обойти это можно просто: добавь в insertUpdate
Код

SwingUtilities.invokeLater(new Runnable()
{
       public void run()
       {
           // а здесь твой код который был в кейРелеазед
       }
   });



--------------------

PM   Вверх
Leopard25
Дата 19.12.2004, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо !
--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
heraclitus
Дата 30.6.2007, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Где можно почитать о работе с компонентами JTextPane, JEditorPane, только не сайт Sun? Хотелось бы с примерами... 
PM MAIL   Вверх
LSD
Дата 30.6.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Портянкин - SWING эффективные пользовательские интерфейсы 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
heraclitus
Дата 1.7.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



пасиб
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0838 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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