Страница 1 из 1

Где спрятан even TextChanged для jTextField?

Добавлено: 06 июл 2006, 01:01
michael
собственно сабж

Добавлено: 06 июл 2006, 01:14
michael
Вот накопал

Код: Выделить всё

 txtTimer.setText(-1+"");
        txtTimer.getDocument().putProperty("name",txtTimer.getText());
        txtTimer.setForeground(new java.awt.Color(255, 0, 0));
        txtTimer.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED, null, new java.awt.Color(204, 204, 204), null, null));
        txtTimer.setFocusable(false);
        txtTimer.setMinimumSize(new java.awt.Dimension(15, 18));
        txtTimer.getDocument().addDocumentListener(new DocumentListener(){

			public void insertUpdate(DocumentEvent e) {
				 Document doc = (Document)e.getDocument();
				if (doc.getProperty("name").toString().trim().equals("0"))
					System.out.println("from insert");
				
			}

			public void removeUpdate(DocumentEvent e) {
				 Document doc = (Document)e.getDocument();
					if (doc.getProperty("name").toString().trim().equals("0"))
						System.out.println("from remove");
				
			}
вижк что число в txtTimer доходит до нуля , но ничего не происходит

Добавлено: 06 июл 2006, 04:07
Oscar
InputVerifier подойдёт?

в приведённом коде столько всего лишнего, что не могу понять, что именно требуется сделать.

P.S. Можно, конечно, и по грубому: textField.addKeyListener ;-)

Добавлено: 06 июл 2006, 10:06
michael
keyListenet не подойдёт так как текст нетмяется не с клавиатуры , а каким то TimerThread. Вот упрощённый код

Код: Выделить всё

txtTimer.setText(-1+""); 
        txtTimer.getDocument().putProperty("name",txtTimer.getText()); 
         txtTimer.getDocument().addDocumentListener(new DocumentListener(){ 

         public void insertUpdate(DocumentEvent e) { 
             Document doc = (Document)e.getDocument(); 
            if (doc.getProperty("name").toString().trim().equals("0")) 
               System.out.println("from insert"); 
             
         } 

         public void removeUpdate(DocumentEvent e) { 
             Document doc = (Document)e.getDocument(); 
               if (doc.getProperty("name").toString().trim().equals("0")) 
                  System.out.println("from remove"); 
             
         } 

Добавлено: 06 июл 2006, 11:17
Oscar
michael, честно говоря, JTextField в коде я так и не нашел ...

Но если интересует какой-нибудь change в данной конструкции,
то навешивающийся DocumentListener имеет метод "changedUpdate"

а поскольку DocumentListener - это интерфейс, удивлён, что в приведённом коде не указан этот метод
(с другой стороны, код ведь явно обрезан снизу)

Добавлено: 06 июл 2006, 12:38
michael
txtTimer=JTextField сейчас попробую повешать что нибудь на changedUpdate

Добавлено: 06 июл 2006, 12:50
michael
OSCAR не прошло.
Поясню условие задачи. Есть thread что считает от 30 до нуля. Каждую секунду он обновляет JTextField (txtTimer). На самом деле можно возложить на него обязонасть сделать что то когда время проходит, но меня уже заинтересовал вопрос как отследить text changed для JTextField . Пока что-никак
вот что я сделал до сих пор

Код: Выделить всё

 
        txtTimer.setText(-1+"");
        txtTimer.getDocument().putProperty("name",txtTimer.getText());
        txtTimer.getDocument().addDocumentListener(new DocumentListener(){

			public void insertUpdate(DocumentEvent e) {
				 Document doc = (Document)e.getDocument();
				
				if (doc.getProperty("name").toString().trim().equals("0"))
					System.out.println("from insert");
				
			}

			public void removeUpdate(DocumentEvent e) {
				 Document doc = (Document)e.getDocument();
					if (doc.getProperty("name").toString().trim().equals("0"))
						System.out.println("from remove");
				
			}

			public void changedUpdate(DocumentEvent e) {
				 Document doc = (Document)e.getDocument();
					if (doc.getProperty("name").toString().trim().equals("0"))
						System.out.println("from change");
				
			}});
-1 это изначальное значение JTextField . Одназначно Thread работает. (Я вижу визуально как меняются значения в JTextField )

Добавлено: 06 июл 2006, 13:18
Oscar
michael, нашел я у тебя ошибку ...

Если не вызывается System.out.println("from .."); то не будет ли логичным посмотреть, почему условие не выполняется-то? ;-)

итак, в самом начале для документа устанавливается проперти name со значением "-1".
Что у нас происходит дальше?
Правильно, поток декрементирует себе значение тэкстФилда, но проперти-то остаётся "-1" ))))
Думаю, ты понял мою мысль.

Вот вариант того что ты хочешь, так чтобы не лезть в Thread

Код: Выделить всё

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;

public class TextFieldDemo implements Runnable {
	
	private JTextField textField;
	private int countDown = 5;
	private boolean running = true;
	
	public TextFieldDemo() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		textField = new JTextField();
		textField.setText(countDown + "");
		textField.setEditable(false);
		textField.getDocument().putProperty("test", textField.getText());
		textField.getDocument().addDocumentListener(new DocumentListener(){

			public void insertUpdate(DocumentEvent e) {
				Document doc = (Document)e.getDocument();
				System.out.println(doc.getProperty("test"));
				check();
			}

			public void removeUpdate(DocumentEvent e) {
				check();
			}

			public void changedUpdate(DocumentEvent e) {
				check();
			}
			
		});
		frame.add(textField);
		frame.pack();
		frame.setVisible(true);
		new Thread(this).start();
	}
	
	private void check() {
		if (textField.getText().equals("0")) {
			running = false;
		}
	}

	public static void main(String[] argv) {
		new TextFieldDemo();
	}

	public void run() {
		while(running) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			countDown--;
			textField.setText(countDown + "");
		}
		
		JOptionPane.showMessageDialog(null, "BABAM!", "big bada bum", JOptionPane.ERROR_MESSAGE);
	}

}
1. В insertUpdate вывод лишь для того, чтобы показать, что проперти не меняется.
2. На самом деле намного проще в методе run опрашивать переменную [ while(countDown > 0) { ], но это уже тебе решать.

Добавлено: 06 июл 2006, 16:40
michael
Спасибо Oscar. Помогло.
--------------------------
2. На самом деле намного проще в методе run опрашивать переменную [ while(countDown > 0) { ], но это уже тебе решать.
--------------------------
Дело в том что поток работает на сервере а обновляет информаию на клиенте, не хочется загружать сервер операциями каторый клиент в состояние сделать сам