Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как изменить текст в JTextPane при изменении текста пользователем? / 12 сообщений из 12, страница 1 из 1
24.01.2007, 13:30:19
    #34278565
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
Делаю 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
24.01.2007, 15:06:55
    #34279011
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
добавь слушателя textPane.getDocument().addDocumentListener(new DocumentListener() {...})
...
Рейтинг: 0 / 0
24.01.2007, 15:11:44
    #34279030
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
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
24.01.2007, 17:22:41
    #34279762
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
Нифига. Тот же самый эксепшин:
Код: plaintext
1.
java.lang.IllegalStateException: Attempt to mutate in notification

Код: plaintext
ROLLBACK;
...
Рейтинг: 0 / 0
24.01.2007, 17:46:13
    #34279854
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
весь код в студию
...
Рейтинг: 0 / 0
24.01.2007, 17:54:45
    #34279883
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
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
24.01.2007, 18:22:10
    #34279983
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
насколько я понимаю, в листнере надо получить документ (а не setText) и его изменять
...
Рейтинг: 0 / 0
24.01.2007, 18:41:05
    #34280037
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
попробуй так. советую Портянкина почитать.

Код: 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
24.01.2007, 18:57:27
    #34280085
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
Deadyпопробуй так. советую Портянкина почитать.

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

Портянкина сейчас и читаю:) Но время поджимает.
...
Рейтинг: 0 / 0
24.01.2007, 19:05:57
    #34280106
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
А ещё один вопрос: почему не удаётся получить введённый символ?
Пробую так:
Код: 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
25.01.2007, 11:07:44
    #34281128
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
Код: 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
25.01.2007, 12:35:07
    #34281543
Sarin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить текст в JTextPane при изменении текста пользователем?
Спасибо, почти то что надо.

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


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