[ jean-todt @ 24.01.2008. 16:07 ] @
ne znam kako da ogranicim unos u text field(unos vrijednosti novca), problem je sto korisnik moze zadati bilo koji broj i taj broj mora imati dvije decimale (formata: ##,##) s time da prije zareza korisnik moze upisati niz proizvoljne veličine

probao sam s maskformaterom ali mislim da tu opciju ne podržava HELLP
[ Java Beograd @ 24.01.2008. 16:53 ] @
Kao prvo, potraži na netu. Definitvno je nekome još odavno to zatrebalo, pa sigurno ima i gotovih klasa. Potraži na deleoperskim sajtovima kao što su code project i sli.

Ali ako si 'teo sam da to pišeš, ili moraš (ko zna zašto) moraćeh da hvataš kez event. Logika i nije tako složena:
nema slova ni interpukcija
minus sme da bude samo na prvom mestu
decimalni znak (zarez ili tačka) sme da se pojavi samo jednom
posle decimalnog znaka smeju da se pojave samo dve cifre
...

Ako korisnik ne unese decimalni znak, možeš sam da ga dodaš kao i dve nule na actionPerformed event nad fieldom.
[ zigizig @ 25.01.2008. 09:17 ] @
Mozda nesto ovako

txtField.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent e) {
if (e.getKeyChar() == '.'
&& Logic.getInstance().twoDotsDisable(
txtField.getText()))
e.consume();
if (e.getKeyChar() != e.VK_BACK_SPACE
&& Logic.getInstance().twoDecimalMax(
txtField.getText()))
e.consume();
if (!('0' <= e.getKeyChar() && e.getKeyChar() <= '9')
&& e.getKeyChar() != e.VK_BACK_SPACE
&& e.getKeyChar() != '.') {
e.consume();
}
}
}


a u Logic klasi

public class Logic {

private static Logic instance = null;

public static Logic getInstance() {
if (instance == null)
instance = new Logic();
return instance;
}

public double roundDouble(double d, int places) {
return Math.round(d * Math.pow(10, (double) places))
/ Math.pow(10, (double) places);
}

public boolean twoDotsDisable(String text) {
if (text.contains("."))
return true;
else
return false;
}

public boolean twoDecimalMax(String text) {
if (text.contains(".")) {
int index = text.lastIndexOf(".");
String ostatak = text.substring(index + 1);
if (ostatak.length() >= 2)
return true;
else
return false;
} else
return false;
}
}
[ jean-todt @ 25.01.2008. 17:28 ] @
Ovo sam isprobao ali mi stalno blokira "," i "." a meni treba da se unašaju brojevi sve dok se unese "," kada se unese zarez
trebaju se unjeti još samo dva broja(odnosno dvije decimale).....
[ zigizig @ 25.01.2008. 23:57 ] @
Pa nije valjda da ne mozes da prepravis kod :)
Vrlo je jednostavan i mozes videti da treba da zamenis tacku sa zarezom gde god se pojavljuje
e.getKeyChar() == '.'
text.contains(".")

Jedini problem koji mozes da imas je sto koristis zarez za decimale jer takav broj neces moci da adekvatno sacuvas u double jer po standardu za decimale se koristi tacka..
U konkretnom primeru dozvoljava se kucanje samo jedne tacke (kao decimalne tacke) i posle nje dozvoljava dva decimalna broja. Prepravi kod tako da dozvoljava kucanje samo jednog zareza ali onda se snadji kako da takav broj sacuvas u promenljivu jer ovo Double.parseDouble(txtField.getText()) nece raditi kako treba.
[ m.djukic @ 01.02.2008. 20:23 ] @
Pri radu sa formatovanim podacima, umesto TextField bolje je raditi sa FormattedTextField,
upravljanje unosom numerickih podataka moze se vrsiti sa FormatterFactory, primer:

private javax.swing.JFormattedTextField duguje;
...
NumberFormat nfn = NumberFormat.getNumberInstance();
nfn.setMinimumIntegerDigits(1);
nfn.setMaximumIntegerDigits(10);
nfn.setGroupingUsed(false);
nfn.setMaximumFractionDigits(2);
nfn.setMinimumFractionDigits(2);
nfn.setGroupingUsed(false);
DefaultFormatterFactory numberFactory =
new DefaultFormatterFactory(new NumberFormatter(nfn),new NumberFormatter(nfn),new NumberFormatter(nfn));
duguje.setFormatterFactory(numberFactory);