Filtrowanie pola tekstowego

0

Witam
Przepisałem sobie kod z "Java Core Techniki Zaawansowane" który miał nie pozwalac uzytkownikowi do wpisywania danych inncyh niz litery i znak '-'. Niestety ten program nie działa w ten sposób. Może ktoś wskazac błąd?
kod:

 import java.awt.*;
import java.text.NumberFormat;

import javax.swing.*;
import javax.swing.text.*;


public class Test {
	public static void main(String args[]){
		EventQueue.invokeLater(new Runnable(){
			public void run(){
				JFrame f = new JJFrame();
				f.setVisible(true);
			}
		});
	}

}

class JJFrame extends JFrame{
	public JJFrame(){
		JFormattedTextField field = new JFormattedTextField(new InternationalFormatter(NumberFormat.getIntegerInstance()){
			protected DocumentFilter getDocumentFilter(){
				return filter;
			}
			private DocumentFilter filter = new IntFilter();
		});
		add(field);
		pack();
	}
}

class IntFilter extends DocumentFilter{
	public void insertString(FilterBypass fb,int offset,String string,AttributeSet set) throws BadLocationException{
		StringBuilder builder = new StringBuilder(string);
		System.out.println("dasdas");
		for(int i = builder.length() -1; i>=0;i--){
			int cp = builder.codePointAt(i);
			if(!Character.isDigit(cp) || cp !='-'){
				builder.deleteCharAt(cp);
				if(Character.isSupplementaryCodePoint(cp)){
					i--;
					builder.deleteCharAt(i);
				}
			}
		}
		super.insertString(fb,offset,builder.toString(),set);
	}
	
	public void replaceString(FilterBypass fb,int offset,String string,AttributeSet set) throws BadLocationException{
		StringBuilder builder = new StringBuilder(string);
		for(int i = builder.length() -1; i>=0;i--){
			int cp = builder.codePointAt(i);
			if(!Character.isDigit(cp) || cp !='-'){
				builder.deleteCharAt(cp);
				if(Character.isSupplementaryCodePoint(cp)){
					i--;
					builder.deleteCharAt(i);
				}
			}
		}
		super.replace(fb,offset,offset, builder.toString(),set);
	}
}
0

"Niestety ten program nie działa w ten sposób. "

a w jaki?<

0

moge wpisywać dowolne znaki do pola. I oczywiście miał one pozwalac na wpisanie znaku - i cyfr:)

0

Ciekawe, nigdy nie bawiłem się FormattedTextFieldem - jak już validacje robiłem z łapy - szczerze? Mniej kodu to zajmowało (walidacja pola w którym podaje się tylko adres ip - więc przypadek podobny)
Możesz spróbować sobie poustawiać breakpointy w tych dwóch metodach insertString i replaceString i puścić debugger żeby sprawdzić co tam się dzieje (czy w ogóle wchodzi do tych metod:))
Może i tak się powinno robić dla skomplikowanych filtrów, ale dla takiego banału to wystarczy zwykły listener (keyListener lub jakiś coś w ten deseń).

0

o validacji tez wiem:) chciałem zobaczyć coś innego:)

0
for(int i = builder.length() -1; i>=0;i--){
                        int cp = builder.codePointAt(i);
                        if(!Character.isDigit(cp) || cp !='-'){
                                builder.deleteCharAt(cp);

Czemu usuwasz znak z pozycji cp? Ja bym usuwał z pozycji i.

1 użytkowników online, w tym zalogowanych: 0, gości: 1