Textboxeigenschaften

Status
Nicht offen für weitere Antworten.

manuche

Bekanntes Mitglied
Hallo!
In meinem Programm verwende ich ein paar Textboxen was auch alles schön und gut ist...
Ich habe allerdings folgende Ansprüche an die Textboxen:

-Sie dürfen nur Zahlen enthalten
-Maximale Zeichenlänge ist 1

Der Code funzt nur weiss ich halt nicht wie man sich die TB so initialisiert!
Code:
int k = 5;
int l = 5;
for (int i = 0; i < 9; i++){
  if (i == 3 || i == 6){
    k += 5;
  }
  for (int j = 0; j < 9; j++){
    if (j == 3 || j == 6){
      l += 5;
    }
    matrix[i][j] = new TextField();
    matrix[i][j].setBounds(l, k, 25, 25);
    gridpanel.add(matrix[i][j]);
    l += 27;
  }
  l = 5;
  k += 27;
}

Wenn wir schonmal dabei sind, gibts für java eine hilfe wo alle funktionen übersichtlich aufgelistet sind?
alles was ich bisher gesehen hab war unübersichtlich...
Gruß manuche
 

manuche

Bekanntes Mitglied
Naja also wenn das übersichtlich sein soll dann weiss ich auch nich aber darum gehts auch grad nicht und es könnte auch an meiner mangelnden erfahrung mit java liegen... vllt bin ich auch nur von andere hilfen verwöhnt... ;)
 

manuche

Bekanntes Mitglied
heisst das, dasss ich erst eine neue Klasse anlegen muss die da wäre:

Code:
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class IntegerDocument extends PlainDocument 
{ 
   public void insertString(int offset, String s, AttributeSet attributeSet) throws BadLocationException 
    { 
      try{ 
             Integer.parseInt(s); 
         } 
         catch(Exception ex)   //only allow integer values 
         { 
            Toolkit.getDefaultToolkit().beep(); //macht ein DÜT 
            //System.out.println("Keine Zahl!"); 
            return ; 
         } 
      super.insertString(offset,s, attributeSet); 
    } 
}

um dann in meinem eigentlichen programm auf sie zu verweisen?

Code:
JTextField tmp = new JTextField(); 
tmp.setDocument(new IntegerDocument());

zudem habe ich normale TextFields und keine JTextFields... Spielt das eine Rolle und wenn ja wo ist der Unterschied bzw kann ich's dann einfach umstellen? Fragen über Fragen... ;)
 

*Hendrik

Bekanntes Mitglied
manuche hat gesagt.:
Spielt das eine Rolle und wenn ja wo ist der Unterschied bzw kann ich's dann einfach umstellen? Fragen über Fragen... ;)

Kommt darauf an, ob Du eine AWT oder eine Swing Anwendung hast. Jedenfalls solltest Du Swing und AWT nicht miteinander vermischen.

manuche hat gesagt.:
heisst das, dasss ich erst eine neue Klasse anlegen muss die da wäre:

Code:
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class IntegerDocument extends PlainDocument 
{ 
   public void insertString(int offset, String s, AttributeSet attributeSet) throws BadLocationException 
    { 
      try{ 
             Integer.parseInt(s); 
         } 
         catch(Exception ex)   //only allow integer values 
         { 
            Toolkit.getDefaultToolkit().beep(); //macht ein DÜT 
            //System.out.println("Keine Zahl!"); 
            return ; 
         } 
      super.insertString(offset,s, attributeSet); 
    } 
}

um dann in meinem eigentlichen programm auf sie zu verweisen?

Code:
JTextField tmp = new JTextField(); 
tmp.setDocument(new IntegerDocument());

Vorausgesetzt Du verwendest Swing und ein JTextField: Ja (Allerdings müsstest Du in der Methode insertString(..) einfügen, dass super.insertString(..) nur aufgerufen wird, wenn die Eingabe nicht größer als 1 ist, d.h. es kann nur 1 Zeichen eingegeben werden.

Bleibst Du bei einem TextField, so musst Du z.B. einen KeyListener implementieren, der die Eingabe prüft und nur 1-stellige Zahlen zulässt und Deinem TextField zuweisen.
 

manuche

Bekanntes Mitglied
Ok... eigentlich wollte ich nichts verwerfen... wie füge ich denn einen keylistener hinzu? wo wird er deklariert etc...?
 

manuche

Bekanntes Mitglied
Ich hab mal versucht mir das zusammen zu basteln wie ich es mir vorstell nur glaub ich es geht voll in die falsch richtung...
Code:
int k = 5;
int l = 5;
for (int i = 0; i < 9; i++){
  if (i == 3 || i == 6){
    k += 5;
  }
  for (int j = 0; j < 9; j++){
    if (j == 3 || j == 6){
      l += 5;
    }
    matrix[i][j] = new TextField();
    matrix[i][j].setBounds(l, k, 25, 25);
    matrix[i][j].addActionListener(new Actionlistener(){
      public void actionPerformed(KeyEvent fe){
        if (!(fe < 10 || fe > 0)){                             // Bedingung: Länge = 1 fehlt (muss ich mir erst den String besorgen und den dann auf seine Länge prüfen???
          matrix[i][j].setText("Z");
        }
      }
    });
    gridpanel.add(matrix[i][j]);
    l += 27;
  }
  l = 5;
  k += 27;
}
 

manuche

Bekanntes Mitglied
Obwohl ich da jetzt probiert hab alles nachzu vollziehen bekomm ichs einfach nicht hin... ich bräuchte mal nen handfestes beispiel aber ich hab noch keins gefunden!
 

*Hendrik

Bekanntes Mitglied
Eher sowas wie das hier:

Code:
        matrix[i][j].addKeyListener(new KeyAdapter() {

            public void keyReleased(java.awt.event.KeyEvent evt) {

                String input = ((TextField)evt.getSource()).getText();

                if(input.length() > 1){
                    ((TextField)evt.getSource()).setText(input.substring(0,1));
                    ((TextField)evt.getSource()).setCaretPosition(1);
                }
                try{
                    Integer.parseInt(((TextField)evt.getSource()).getText());
                }catch(NumberFormatException e) {
                    ((TextField)evt.getSource()).setText("");
                }
            }
        });
 

manuche

Bekanntes Mitglied
Klappt super! DAnke für die ausführliche Hilfe! Eine Frage ahb ich allerdings noch...
Und zwar ist es jetzt noch möglich, die Zahl 0 einzutippen... ich weiss allerdings nicht, an welcher stelle ich das ausschliessen kann... ich hab gedacht im catch zweig allerdings kann man da nicht einfach sagen "|| textfield == 0"... oder ich bekomms nicht hin!
gruß manuche
 

manuche

Bekanntes Mitglied
Alles klar hab gefunden wie ich es einbauen kann!
trotzdem danke an die die schon angefangen haben sich zu bemühen!!
Meine Lösung ist folgende:

Code:
matrix[i][j].addKeyListener(new KeyAdapter() { 
  public void keyReleased(java.awt.event.KeyEvent evt) { 
    String input = ((TextField)evt.getSource()).getText(); 
    if (input.length() > 1){ 
      ((TextField)evt.getSource()).setText(input.substring(0,1)); 
      ((TextField)evt.getSource()).setCaretPosition(1); 
    }
    try{ 
      Integer.parseInt(((TextField)evt.getSource()).getText());
      int zahl = Integer.valueOf(input).intValue();
      if (zahl == 0){
        ((TextField)evt.getSource()).setText(""); 
      }
    }catch(NumberFormatException e) { 
      ((TextField)evt.getSource()).setText(""); 
    } 
  } 
});

Gruß manuche
 

*Hendrik

Bekanntes Mitglied
Da parseInt() bereits den int-Wert zurückliefert, kannst Du Dir eine Zeile sparen:
Code:
        try{
            int zahl = Integer.parseInt(((TextField)evt.getSource()).getText());
            if(zahl == 0)
                ((TextField)evt.getSource()).setText("");
        }catch(NumberFormatException e) {
            ((TextField)evt.getSource()).setText("");
        }
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben