negative Zahlen einlesen in JTextField per Document
-
Hallo,
Ich habe folgendes Dokument geschrieben um bei einem JTextField eine Eingabe auf eine gewisse Zeichenzahl zu begrenzen und nur Zahlen, sowie doubles, zuzulassen.
Mein Problem jetz ist, dass ich gerne auch negative Zahlen eingeben wollen wuerde. Wie schaffe ich es auf elegante Weise eben auch ein - einzulesen soweit es am Anfang steht, bzw es auch wenn dann nur am Anfang zuzulassen?package transform; import java.awt.*; import javax.swing.*; import javax.swing.text.*; public class DoubleDocument extends PlainDocument{ private boolean bDot = false; //private boolean bMinus = false; // ??? private JTextField tfText = null; private int iMaxCharacter = -1; public DoubleDocument(JTextField text, int len){ this.tfText = text; iMaxCharacter = len; } public void insertString(int offset, String szStr, AttributeSet attributeSet) throws BadLocationException{ bDot = tfText.getText().toString().indexOf(".") == -1 ? false : true; try{ // check length if((szStr != null) && (iMaxCharacter > 0) && ((this.getLength() + szStr.length()) > iMaxCharacter)){ java.awt.Toolkit.getDefaultToolkit().beep(); return; } // check double if(szStr.indexOf(".") != -1 && szStr.length() > 1) bDot = true; if(!szStr.equals(".")) Double.parseDouble(szStr); else if(bDot) throw new Exception(); else bDot = true; } catch(Exception exeption){ Toolkit.getDefaultToolkit().beep(); return ; } super.insertString(offset,szStr, attributeSet); } }
-
Hab mir nicht den ganzen Source jetzt durchgelesen, aber mit:
String s = TextField.getText(); boolean hasMinus = false; if(s.contains('-')) hasMinus = true; //es gibt eins if(hasMinus && s.charAt(0) == '-') minus = true; //wenn ERSTES Zeichen '-'
sollte's gehen.
Edit: Du kannst, so meine ich, wenn das Minus korrekt gestezt ist auch gleich:
String s = "-1.234"; double d = (Double.parseDouble(s)).doubleValue();
schreiben.
MFG John
-
package transform; import javax.swing.*; import javax.swing.text.*; public class DoubleDocument extends PlainDocument{ private boolean bDot = false; private JTextField tfText = null; private int iMaxCharacter = -1; public DoubleDocument(JTextField text, int len){ this.tfText = text; iMaxCharacter = len; } public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { StringBuffer sb = new StringBuffer(); sb.append(getText(0,offs)); sb.append(str); sb.append(getText(offs,getLength()-offs)); if (sb.toString().length()> iMaxCharacter) { return; } try { Double.parseDouble(sb.toString()); } catch (NumberFormatException e) { if (!sb.toString().equals("-")) return; //doesn't return on a single '-' } super.insertString(offs, str, a); } }
So schaut meine Loesung in der Zwischenzeit aus, das Problem (weshalb "doesn't return on a single "-" " noetig war) war v.a., dass andere Loesungen es zwar zuliessen eine Zahl einzutippen und danach ein - davor zu setzen, aber zB nicht mit einem "-" zu beginnen. Das fand ich etwas unkomfortabel, wenn mans nicht weiss, koennte das nervig sein und nach baaaaaaad energy aussehen..
Daher hab ichs nun so gemacht. Zu erwaehnen ist nun, dass man in der Anwendung im Code evtl noch eine Schleife schreiben muesste, die zB ein einziges eingegebenes "-" abfaengt (da ja sonst nix vom Typ double gesetzt wird). Dabei setz ich es halt einfach wieder auf den Standard zurueck. Desweiteren scheint es wohl auch per JFormattedTextField moeglich zu sein, komplet auf das Document zu verzichten - da kenn ich mich aber noch nich aus