Avatar billede fbisoft Nybegynder
18. december 2003 - 22:17 Der er 18 kommentarer

forhindring af illegal indtastning

jeg har lavet et JTextField som skal modtage et int,
hvordan forhindrer jeg er der bliver skrevet noget "ulovligt" eks. "børge"

er der noget der kan hjælpe mig!
Avatar billede danny_k Nybegynder
18. december 2003 - 22:25 #1
Avatar billede repsak Nybegynder
18. december 2003 - 22:32 #2
public static void onlyInt(TextComponent com){
    com.addKeyListener(new KeyAdapter(){
        public void keyTyped(KeyEvent evt){
            char ch = evt.getKeyChar();
            if (!('0' <= ch && ch <= '9' || Character.isISOControl(ch))){
                evt.consume();
            }
        }
    });
}
Avatar billede danny_k Nybegynder
18. december 2003 - 22:39 #3
Med JFormattedTextField kan man spare nogle liniers kode, men det er selvfølgelig også kun brugbart efter version 1.4
Avatar billede labanos Nybegynder
19. december 2003 - 09:20 #4
den simple løsning, som nok også er den mest normale, er vel at en
Integer.parseInt(inputText); og derefter lave sin fejlhåndtering i en try catch der fanger den NumberFormatException der vil blive kastet hvis den ikke er en int. Om du vil lave den før du sætter texten, eller med en getText() bagefter på dit textfield er op til dig.
Avatar billede labanos Nybegynder
19. december 2003 - 09:25 #5
hvis det er brugeren der taster noget ind i et dit JTextField, kan du adde en FocusListener på dit textField og derefter:
public void focusLost(FocusEvent e) {
  try {
    Integer.parseInt(inputField.getText());
  } catch(NumberFormatException nfe) {
      doSomeErrorHandling();
      //eks. inputField.setText(0);
      //    inputField.selectAll();
      //    inputField.requestFocus();
    }
}
Avatar billede labanos Nybegynder
19. december 2003 - 09:25 #6
selvfølgelig - inputField.setText(""+0);
Avatar billede danny_k Nybegynder
19. december 2003 - 09:34 #7
Jeg mener nu nok at JFormattedTextField lyder som det mest simple
Avatar billede labanos Nybegynder
19. december 2003 - 09:40 #8
det er da meget muligt... smid lige et eksempel så vi kan se hvor simpelt det er?
Avatar billede conrad Nybegynder
19. december 2003 - 09:43 #9
Hvis du gerne vil registrere hver gang der bliver tastet et tegn ind så skal du bruge en DocumentListener
Avatar billede repsak Nybegynder
19. december 2003 - 09:50 #10
Hehe så er der religionskrig...
Hvorfor tænke så meget over hvor meget det fylder? Det gælder om at få en løsning som virker max.
1) hvis løsningen ikke skal kunne fungere ved tidligere versioner så brug danny_k's løsning. (jeg antager at det virker, da jeg ikke selv kender JFormattedTextField )
2) Hvis løsningen skal være bagudkompatibel samt hvis det ikke skal være muligt at indtaste chars så skal min løsning bruges.

Jeg kan slet ikke se fordelen ved labanos' løsning???
Avatar billede conrad Nybegynder
19. december 2003 - 09:52 #11
repsak> hvad sker der når man copy paster i din løsning?
Avatar billede labanos Nybegynder
19. december 2003 - 09:56 #12
fordel? Sorry men JFormattedTextField er syntaktisk sukker for min løsning, den gør sådan set det sammen, bare med et par yderligere muligheder for hvad der skal ske ved en fejl.

Ligesom du slet ikke kan se fordelen ved min løsning, kan jeg heller ikke rigtig se fordelen ved din ;)

Men jeg vil give dig ret, brug en løsning ud fra betragtningen om kompabilitet, og ikke vores personlige preferencer... men hvis du bruger en ny java.. så brug JFormattedTextField..
Avatar billede conrad Nybegynder
19. december 2003 - 10:09 #13
her er et eksempel med DocumentListener - med en DocumentListerner så får du en event når der bliver skrevet, slettet eller ændret i dit tekstfelt. Med en keyListener får du en event når der trykkes på en key, dvs du kan "snyde" af tekstfeltet ved at copy paste med musen. Om det er et problem afhænger af din situation

import javax.swing.*;
import java.awt.*;

import javax.swing.event.*;
public class MyFrame extends JFrame implements DocumentListener
{

   
    JTextField inputField;
   
    public MyFrame()
    {
        super("Text test");
        setSize(500,500);
       
       
        inputField = new JTextField("",20);
        inputField.getDocument().addDocumentListener(this);
        getContentPane().setLayout(new GridLayout(2,1));
        getContentPane().add(new JLabel("Write something"));
        getContentPane().add(inputField);           
        setVisible(true);   
       
   
    }

    //Gives notification that an attribute or set of attributes changed.
    public void changedUpdate(DocumentEvent e)
    {
        try
        {
            Integer.parseInt(inputField.getText());
          }
          catch(NumberFormatException nfe)
          {
            JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE);
           
        }
    }
   
    //Gives notification that there was an insert into the document.
    public void insertUpdate(DocumentEvent e)
    {
        try
        {
            Integer.parseInt(inputField.getText());
          }
          catch(NumberFormatException nfe)
          {
            JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE);
        }
    }     
    //Gives notification that there was an remove from the document.
   
    public void removeUpdate(DocumentEvent e)
    {
        try
        {
            Integer.parseInt(inputField.getText());
          }
          catch(NumberFormatException nfe)
          {
            JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE);
        }
       
    } 




    public static void main(String args[])
    {
        MyFrame f = new MyFrame();   
    }

}
Avatar billede repsak Nybegynder
19. december 2003 - 10:10 #14
conrad -> aner det ikke, men mon ikke at den paster normalt? Den situation må man nok progge sig ud af

labanos -> fordelen ved min er at du slipper for try-catch og vi tillader slet ikke brugeren at indtaste andet end tal. Hvorfor tillade det hvis det kan undgås?
Avatar billede labanos Nybegynder
19. december 2003 - 10:21 #15
repsak: det er op til den enkelte udvikler.. det handler vel om hvordan man ønsker at behandle den bruger der indtaster noget... hvornår og hvordan han/hun skal have at vide at han gøre noget forkert... og om han skal have det at vide? :)

Personligt er jeg nok mest til JFormattedTextField, ser ud til at være en smooth løsning ;) (har bare ik set den før, da den ikke eksisterede da jeg startede med java). Synes nok at en docomentListener er lidt overkill til noget så simplet som input af en int... men ok.. det virker...

If it works, dont try to fix it.
Avatar billede repsak Nybegynder
19. december 2003 - 10:26 #16
labanos -> klart, det er op til den enkelte, men jeg kan bare ikke se nogen grund til at tillade noget som kan forhindres (altså at brugeren indtaster karakterer istedet for tal). Så kan man altid diskutere hvordan Conrad's problem skal håndteres (copy/paste)
Avatar billede labanos Nybegynder
19. december 2003 - 10:33 #17
repsak: det kan du have ret i, det eneste umiddelbare argument er at det kan irritere en bruger, hvis han ikke ved hvad han gør galt. Anyways, det betyder jo nada, hvad der betyder noget er at fbisoft fik et par løsninger at vælge imellem ;)
Avatar billede repsak Nybegynder
19. december 2003 - 10:37 #18
Enig, for nu er vi vel nærmest ude i at tale brugervenlighed/grænseflade...;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester