und diese Zahlen will ich in Form von ints auslesen.
Hier mein Ansatz:
Zuweisung des Wertes:
Java:
addition1.setValue(newInteger(1));
Auslesen:
Java:
addition.getValue()
hat nicht geklappt, ein Freund hat mir aber dann folgenden Tipp gegeben:
Java:
((Number) addition1.getValue()).intValue()
Da kommt aber dann merkwürdigerweise immer 0 raus. ???:L
Und soeben habe ich gemerkt, dass man bei .setValue() anscheinend den inhalt des Feldes anscheinend nicht verändern kann, also ist mein Ansatz wohl schrott.
Schrott ist dein Ansatz nicht. Du musst nur bedenken, dass du mit
Java:
newMaskFormatter("#####")
auch angibst, dass das Feld 5 Zahlen enthalten muss. Ansonsten bekommst du eine Exception wenn du den String aus dem Textfeld in Integer parsen möchtest.
Du kannst es so machen, wie Du es begonnen hast:
Java:
int myInt =Integer.parseInt(addition1.getValue().toString());
oder so
Java:
int myInt =Integer.parseInt(jaddition1.getText());
(Funktioniert dann aber nur, wenn Du Deine 5 zeichen voll hast)
Falls die Zahlen in deinem Feld immer unterschiedlich groß sind (mal bestehend aus 3 Ziffern, mal aus 4), benutze doch einfach ein normales Textfeld und verwende ein PlainDocument.
Das ganze würde ungefähr so aussehen:
Java:
jaddition1.setDocument(newPlainDocument(){publicvoidinsertString(int offs,String str,AttributeSet a)throwsBadLocationException{//Hiermit kannst Du z.B. die max Länge des Feldes angebenif(this.getLength()>=5)return;//Hier schmeißt Du alles raus, was keine Zahl istfor(int i =0; i < str.length(); i++){if(!Character.isDigit(str.charAt(i)))return;}//Und Hier setzt Du deine Zahlen in dein Textfeldsuper.insertString(offs, str, a);}});
Das auslesen erfolgt dann so:
Java:
int myInt =Integer.parseInt(jaddition1.getText());
So musst Du nicht immer 5 Zeichen angeben und das Handling finde ich persönlich auch besser.
die int offs sind die Zahlen, die in das Textfeld einteragen werden.
Das String str steht für alles was Strings sind und das AttributeSet a steht glaube ich für die Zuordung auf deiner Tastatur (Der Key "A" auf deiner Tastatur ist dem Character A zugeordnet).
Aber woher dein Fehler kommt, kann ich dir nicht so sagen.
Vielleicht kannst Du mal deinen Code posten, indem du dein Text feld initialisierst und verarbeitest.
try{
addition1 =newJFormattedTextField();...}catch(ParseException e){
e.printStackTrace();}
addition1.setDocument(newPlainDocument(){publicvoidinsertString(int offs,String str,AttributeSet a)throwsBadLocationException{//In dieser Zeile kommt bei AttributeSet a die Fehlermeldungif(this.getLength()>=5)return;for(int i =0; i < str.length(); i++){if(!Character.isDigit(str.charAt(i)))return;}super.insertString(offs, str, a);}});
addition1.setValue(newInteger(1));
du benutzt ja immer noch ein JFormattedTextField.
Du musst dann ein JTextField verwenden. Daher rührt auch deine Fehlermeldung.
Java:
JTextField addition1 =newJTextField();
Und um etwas in dein TextField zu schreiben verwendest Du am besten:
Java:
addition1.setText(""+ meinIntegerWert);
statt setValue.
Die Anführunsstriche musst Du setzen, damit dem Textfeld ein String übergeben werden kann.
Würde im ganzen dann so aussehen:
Java:
try{
addition1 =newJTextField();// Denk dran, dies auch bei der Initialisierung anzupassen.// Also bei "JTextField addition1;"}catch(ParseException e){
e.printStackTrace();}
addition1.setDocument(newPlainDocument(){publicvoidinsertString(int offs,String str,AttributeSet a)throwsBadLocationException{//In dieser Zeile kommt bei AttributeSet a die Fehlermeldungif(this.getLength()>=5)return;for(int i =0; i < str.length(); i++){if(!Character.isDigit(str.charAt(i)))return;}super.insertString(offs, str, a);}});
addition1.setText(""+newInteger(1));
importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjavax.swing.event.*;importjavax.swing.text.*;publicclassTestTextFieldextendsJFrame{privateJTextField jaddition1 =newJTextField();publicTestTextField(String title){super(title);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);int frameWidth =180;int frameHeight =100;setSize(frameWidth, frameHeight);Dimension d =Toolkit.getDefaultToolkit().getScreenSize();int x =(d.width -getSize().width)/2;int y =(d.height -getSize().height)/2;setLocation(x, y);Container cp =getContentPane();
cp.setLayout(null);//Textfeld setzen
jaddition1.setBounds(20,20,121,24);
jaddition1.setText("");
cp.add(jaddition1);//PlainDocument setzen
jaddition1.setDocument(newPlainDocument(){publicvoidinsertString(int offs,String str,AttributeSet a)throwsBadLocationException{//In dieser Zeile kommt bei AttributeSet a die Fehlermeldungif(this.getLength()>=5)return;for(int i =0; i < str.length(); i++){if(!Character.isDigit(str.charAt(i)))return;}super.insertString(offs, str, a);}});//Wert an Textfeld übergeben
jaddition1.setText(""+123456);setVisible(true);}publicstaticvoidmain(String[] args){newTestTextField("Textfeld");}}
Füge doch bei deinen Imports mal die AttributeSet Klasse mit ein: ;-)
Java:
importjavax.swing.text.AttributeSet;
Dann gehts.
PS: Und vergiss nicht, nur noch getText() und setText() zu verwenden anstatt getValue() und setValue(). Diese Methoden gibt es nämlich in der JTextField Klasse nicht.
Allerdings eine letzte Sache noch: ich habe eine Methode, der zwei ints übergeben werden müssen. .setText liefert einen String zurück in dem sich dann nur Zahlen befinden. Wie bekomme ich es aber jetzt hin, die ints aus dem JTextField der Methode zu übergeben?