powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как изменить текст в JTextPane при изменении текста пользователем?
12 сообщений из 12, страница 1 из 1
Как изменить текст в JTextPane при изменении текста пользователем?
    #34278565
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю XML-редактор. Хочу чтобы когда пользователь ввёл > автоматически дописался закрывающий тег.
Делаю вот так вот:
Код: plaintext
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.
 import  javax.swing.*;
 import  java.awt.*;
 import  java.awt.event.*;
 import  javax.swing.event.*;
 import  javax.swing.tree.*;
 import  org.w3c.dom.*;

 public   class  XMLTextEditor  extends  JTextPane{
    
    /** Creates a new instance of XMLTextEditor */
     public  XMLTextEditor() {
	 this .addCaretListener( new  ChangeListener());
    }
    

     class  ChangeListener  implements  CaretListener{
	 public   void  caretUpdate(CaretEvent e){
	    setText("Hi");
	}
    }
    
     private   boolean  isNodeEdit = false;
     private  String nodeName = "";    

}
Но Hi появляется только если никакого текста нет и был получен фокус ввода. А мне надо, чтобы при вводе любого символа дописывалось "Hi". Может я не на то событие повесился?

Код: plaintext
ROLLBACK;
...
Рейтинг: 0 / 0
Как изменить текст в JTextPane при изменении текста пользователем?
    #34279011
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавь слушателя textPane.getDocument().addDocumentListener(new DocumentListener() {...})
...
Рейтинг: 0 / 0
Как изменить текст в JTextPane при изменении текста пользователем?
    #34279030
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/TextListener.html
Возможно так. Но насколько я помню, делал через это:
http://java.sun.com/docs/books/tutorial/uiswing/events/documentlistener.html
...
Рейтинг: 0 / 0
Как изменить текст в JTextPane при изменении текста пользователем?
    #34279762
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нифига. Тот же самый эксепшин:
Код: plaintext
1.
java.lang.IllegalStateException: Attempt to mutate in notification

Код: plaintext
ROLLBACK;
...
Рейтинг: 0 / 0
Как изменить текст в JTextPane при изменении текста пользователем?
    #34279854
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
весь код в студию
...
Рейтинг: 0 / 0
Как изменить текст в JTextPane при изменении текста пользователем?
    #34279883
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deadyвесь код в студию
Я переместил обработчик туда где живёт панель. Не стал его в конструкторе навешивать.

Во:
Код: plaintext
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.
 import  javax.swing.*;
 import  java.awt.*;
 import  java.awt.event.*;
 import  javax.swing.event.*;
 import  javax.swing.tree.*;
 import  org.w3c.dom.*;

 import  editor.texteditor.*;

 public   class  EditorPanel  extends  JPanel{

     public  EditorPanel(Document doc) {	

	 this .textArea.getDocument().addDocumentListener( new  TextChangeListener());

	 this .add( new  JScrollPane( this .textArea), BorderLayout.CENTER);
    }
    
     class  TextChangeListener  implements  DocumentListener{
	
	 public   void  insertUpdate(DocumentEvent e){
	     try {
		System.out.println(e.getDocument().getText( 0 , e.getDocument().getLength()));
		textArea.setText("Hi");		
	    }
	     catch  (Exception ex){
		ex.printStackTrace();
	    }
	}

         public   void  removeUpdate(DocumentEvent e){
	    System.out.println("remove");
	}
   
         public   void  changedUpdate(DocumentEvent e){
	    System.out.println("change");
	}
	
    }    

     private  XMLTextEditor textArea =  new  XMLTextEditor();
}

Я порезал то, что не имеет отножения к редактору.
...
Рейтинг: 0 / 0
Как изменить текст в JTextPane при изменении текста пользователем?
    #34279983
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я понимаю, в листнере надо получить документ (а не setText) и его изменять
...
Рейтинг: 0 / 0
Как изменить текст в JTextPane при изменении текста пользователем?
    #34280037
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй так. советую Портянкина почитать.

Код: plaintext
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.
 import  java.awt.*;
 import  java.awt.event.*;
 import  javax.swing.event.*;
 import  javax.swing.text.*;


 public   class  EditorPanel  extends  JPanel{

     public  EditorPanel() {	

	 this .textArea.getDocument().addDocumentListener( new  TextChangeListener());
	setLayout( new  BorderLayout());
	 this .add( new  JScrollPane( this .textArea), BorderLayout.CENTER);
    }
    
     class  TextChangeListener  implements  DocumentListener{
	
	 public   void  insertUpdate(DocumentEvent e){
	     try {
		 final  Document doc = e.getDocument();
		 final   int  pos = e.getOffset()+e.getLength();
		EventQueue.invokeLater( new  Runnable() {
			 public   void  run() {
				 try  {
					doc.removeDocumentListener(TextChangeListener. this );
					doc.insertString(pos, "-",  null );
					doc.addDocumentListener(TextChangeListener. this );
				}
				 catch  (Exception e) {
					e.printStackTrace();
				}
			}
		});
	    }
	     catch  (Exception ex){
		ex.printStackTrace();
	    }
	}

         public   void  removeUpdate(DocumentEvent e){
	}
   
         public   void  changedUpdate(DocumentEvent e){
	}
	
    }    

     private  JTextArea textArea =  new  JTextArea();

     public   static   void  main(String[] args) {
	EditorPanel panel =  new  EditorPanel();

        JFrame frame =  new  JFrame();
	frame.setSize( 400 , 300 );
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(panel);
        frame.setVisible(true);
    }
}
...
Рейтинг: 0 / 0
Как изменить текст в JTextPane при изменении текста пользователем?
    #34280085
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deadyпопробуй так. советую Портянкина почитать.

Спасибо, помогло! Мы поняли, что надо делать invokeLater . но я не догадался, что надо убирать листенер. К чему это приводило, думаю, понятно

Портянкина сейчас и читаю:) Но время поджимает.
...
Рейтинг: 0 / 0
Как изменить текст в JTextPane при изменении текста пользователем?
    #34280106
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё один вопрос: почему не удаётся получить введённый символ?
Пробую так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
		EventQueue.invokeLater( new  Runnable() {
			 public   void  run() {
				 try  {
				     if  (pos >  0 ){
					String s = doc.getText(pos -  1 , pos);
					System.out.println(s);
				    }
				    doc.removeDocumentListener(TextChangeListener. this );
				    doc.insertString(pos, "-",  null );
				    doc.addDocumentListener(TextChangeListener. this );
				}
				 catch  (Exception e) {
					e.printStackTrace();
				}
			}
	    });

Падаю на
Код: plaintext
1.
javax.swing.text.BadLocationException: Invalid location

Код: plaintext
ROLLBACK;
...
Рейтинг: 0 / 0
Как изменить текст в JTextPane при изменении текста пользователем?
    #34281128
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
 import  javax.swing.*;
 import  java.awt.*;
 import  java.awt.event.*;
 import  javax.swing.event.*;
 import  javax.swing.text.*;


 public   class  EditorPanel  extends  JPanel{

     public  EditorPanel() {	

	 this .textArea.getDocument().addDocumentListener( new  TextChangeListener());
	setLayout( new  BorderLayout());
	 this .add( new  JScrollPane( this .textArea), BorderLayout.CENTER);
    }
    
     class  TextChangeListener  implements  DocumentListener{
	
	 public   void  insertUpdate(DocumentEvent e){
	     try {
		 final  Document doc = e.getDocument();
		 final   int  pos = e.getOffset()+e.getLength();
		String lastLetter = textArea.getText()!= null  && textArea.getText().length()> 0  ? textArea.getText(textArea.getText().length()- 1 ,  1 ) :  null ;
		 if  (">".equals(lastLetter)) {
			EventQueue.invokeLater( new  Runnable() {
				 public   void  run() {
					 try  {
						doc.removeDocumentListener(TextChangeListener. this );
						doc.insertString(pos, "\n",  null );
						doc.addDocumentListener(TextChangeListener. this );
					}
					 catch  (Exception e) {
						e.printStackTrace();
					}
				}
			});
		}
	    }
	     catch  (Exception ex){
		ex.printStackTrace();
	    }
	}

         public   void  removeUpdate(DocumentEvent e){
	}
   
         public   void  changedUpdate(DocumentEvent e){
	}
	
    }    

     private  JTextArea textArea =  new  JTextArea();

     public   static   void  main(String[] args) {
	EditorPanel panel =  new  EditorPanel();

        JFrame frame =  new  JFrame();
	frame.setSize( 400 , 300 );
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(panel);
        frame.setVisible(true);
    }
}

обрати внимание на строку
Код: plaintext
1.
textArea.getText(textArea.getText().length()- 1 ,  1 )
в твоем примере параметры неверно заданы
...
Рейтинг: 0 / 0
Как изменить текст в JTextPane при изменении текста пользователем?
    #34281543
Sarin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, почти то что надо.

Код: plaintext
ROLLBACK;
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как изменить текст в JTextPane при изменении текста пользователем?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]