PDA

Visualizza la versione completa : [Java] Numeri Decimali


albert82
01-07-2005, 21:19
Ciao a tutti.

Devo gestire una maschera di inserimento di numeri decimali. Ecco cosa ho fatto. In base alla lunghezza del campo a db creo un format in modo dinamico:



int lunghezza = lunghezzaCampo;
String format="";

for(int i=0;i<=lunghezza;i++){
if(i!=lunghezza-decimali){
format += "#";
}
else{
format+=".";
}

}
try{
JFormattedTextField numDec = new JFormattedTextField(new MaskFormatter(format));
numDec.setColumns(lunghezza);
/* if(!attuale.isValoriUnici() & attuale.isIncrementante())
numDec.setText("1");*/
numDec.setEditable(false);
numDec.setFocusLostBehavior(JFormattedTextField.CO MMIT);
textField.add(numDec);
}catch(Exception th){th.printStackTrace();}



Non ho problemi nel salvare valori che rientrino nel formato specificato. Se ad esempio ###.## posso anche salvare 23.32.. Il problema nasce quando lo devo visualizzare dopo aver fatto la query. Il Mask Formatter si aspetta le tre cifre di parte intera e rifiuta il valore. Sapete se c' un modo per dire al formatter che le cifre sono opzionali?

In alternativa, sapreste indicarmi che soluzione adottare? Ho provato ad utilizzare un DecimalFormat ma non riesco a capire come bloccare il numero di caratteri inseriti nel JFormattedTextField e come evitare l'inserimento di caratteri che non siano numeri..


Spero mi possiate aiutare...Grazie!


Albert

albert82
02-07-2005, 10:36
Ultimamente i mie messaggi vengono snobbati..chiedo cose troppo difficili??

Pu darsi... :dh:

Matteo982
02-07-2005, 10:55
Per quanto mi riguarda non rispondo solo perch con i DB non ho molta confidenza altrimenti non avrei problemi...solo che prima di dire cavolate meglio pensarci su bene! :D

eumene
06-07-2005, 12:13
Io ho risolto in questo modo.

Ho creato una classe, RemovePatternCharHandler, che implementa KeyListener ed ho scritto il seguente codice per ogni evento:


// Mostro solo keyPressed, ma vale anche per
// keyReleased e keyTyped
keyPressed(KeyEvent e) {
try {

javax.swing.text.JTextComponent jTC = (javax.swing.text.JTextComponent) getSource();
jTC.setText(jTC.getText().replaceAll(pattern,""));

} catch(Exception ex) {}

}



RemovePatternCharHandler ha un costruttore che setta la variabile patter, privata, che specifica quali caratteri accettare.



public class RemovePatternCharHandler implements KeyListener {

private String pattern = "";
.
.
.

public RemovePatternCharHandler(String pattern) {
this.pattern = pattern;
}

}




A questo punto basta aggiungere ad ogni JTextField un KeyListner in questo modo.




JTextField jTF = new JTextField()

.
.
.

jTF.addKeyListener(new RemovePatternCharHandler("[^\\d|.]"));



In questo modo dovrebbe permettere di inserire solo caratteri di tipo DIGIT ed il punto, solo che permette di metterne pi di uno.

In generale puoi, con una buona espressione regolare, limitare l'inserimento di qualsiasi carattere, ma non formattarlo.

Che ne dici??

albert82
06-07-2005, 15:01
Grazie per l'aiuto. Nel frattempo io ho risolto cos:
una volta dati in input lunghezza totale del numero e numero di decimali presenti al document aggiunto al textfield, effettuo dei controlli sugli inserimenti.

Ecco il codice della classe che estende PlainDocument. Spero possa servire a qualcuno.




public class TipoNumeroDecimale extends PlainDocument{

private int maxChars;
private int decimal;


public TipoNumeroDecimale(int lunghezza, int decimali){

maxChars=lunghezza+1;
decimal=decimali;

}

public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
boolean continua = true;

if (str.equals(".")){
if (getText(0, getLength()).indexOf(".") == -1) {
super.insertString(offs, str, a);


}
return;
}


try {

if (str.indexOf(".") != -1){
Double.parseDouble(str);

}
else
Integer.parseInt(str);

} catch (NumberFormatException e) {
continua = false;
}

if (continua) {

int length = getLength();
if (length + str.length() <= maxChars) {
String somma = getText(0, length) + str;
if (str.length() == 1) {

if (somma.indexOf(".") != -1) {
if (offs > somma.indexOf(".") &
decimal < somma.substring(somma.indexOf(".") + 1).length()) {
return;
}
if (offs <= somma.indexOf(".") &
maxChars -
decimal - 1 <
somma.substring(0, somma.indexOf(".") + 1).length()) {
return;
}
super.insertString(offs, str, a);
}
else{
if (maxChars - decimal - 1 < somma.length()) {
return;
}
super.insertString(offs, str, a);


}
}

else {
super.insertString(offs, str, a);
}
}
else {

int allowed = maxChars - length;
super.insertString(offs, str.substring(0, allowed), a);

}

}
}
}

Loading