Avatar billede supa Nybegynder
03. marts 2005 - 11:12 Der er 5 kommentarer og
1 løsning

NumberFormatException: For input string: "k"

Hejsa,

Hvordan undgår jeg det her:

Exception in thread "AWT-EventQueue-1" java.lang.NumberFormatException: For input string: "k"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at gui.user.GuiSearch.search(GuiSearch.java:339)
    at gui.user.GuiSearch.actionPerformed(GuiSearch.java:131)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Det er i et JTextField, hvor jeg ønsker at man ikke skal kunne indtaste bogstaver, og hvis man gør, så skal den smide en dialogbox..

Jeg kunne evt. lave en forespørgsel på om der er trykket på 0-9 via KeyEvent.VK_0 til KeyEvent.VK_9, men er der ikke en bedre måde..?
Avatar billede arne_v Ekspert
03. marts 2005 - 11:14 #1
Du har flere muligheder:

1)  du kan bare catche den exception

2)  du kan teste for om det er kun tal inden du kalder Intereger.parseInt

3)  du kan lave det så der kun kan tastes tal ind i feltet
Avatar billede supa Nybegynder
03. marts 2005 - 11:27 #2
Jeg vil gerne se hvad der er bag dør nummer 3.. :D'

Er det en mulighed som kan sættes på JTextField..?
Avatar billede arne_v Ekspert
03. marts 2005 - 12:18 #3
Prøv og kig på JFormattedTextField
Avatar billede arne_v Ekspert
03. marts 2005 - 12:33 #4
Prøv at se forskellen på tf1 og tf2 i nedenstående eksempel:

import java.awt.*;
import java.awt.event.*;
import java.text.*;

import javax.swing.*;

public class DigitsOnly extends JFrame implements ActionListener {
    private JTextField tf1;
    private JFormattedTextField tf2;
    private JButton btn;
    public DigitsOnly() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new GridLayout(3, 1));
        tf1 = new JTextField();
        getContentPane().add(tf1);
        tf2 = new JFormattedTextField(new DecimalFormat("0"));
        getContentPane().add(tf2);
        btn = new JButton("Check");
        btn.addActionListener(this);
        getContentPane().add(btn);
        pack();
    }
    public void actionPerformed(ActionEvent e) {
        if(tf2.getText().equals("")) {
            JOptionPane.showMessageDialog(this, "tf2 er udfyldt forkert");
        } else {
            int i1 = Integer.parseInt(tf1.getText());
            int i2 = Integer.parseInt(tf2.getText());
            JOptionPane.showMessageDialog(this, i1 + " " + i2);
        }
    }
    public static void main(String[] args) {
        DigitsOnly f = new DigitsOnly();
        f.setVisible(true);
    }
}
Avatar billede trp79 Nybegynder
03. marts 2005 - 16:21 #5
Og lige et par alternativer...

AWT:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class NumberTextField extends JTextField implements KeyListener
{
    NumberTextField(){this(10);}

    NumberTextField(int sendSize)
    {
        super(sendSize);
        this.addKeyListener(this);
    }

    public void keyPressed (KeyEvent ke)
    {}
    public void keyReleased(KeyEvent ke){}
    public void keyTyped(KeyEvent ke){
            if(((ke.getKeyChar() < '0') || (ke.getKeyChar() > '9')) && (ke.getKeyChar() != ke.VK_DELETE) && (ke.getKeyChar() != ke.VK_BACK_SPACE) && (ke.getKeyChar() != ke.VK_ENTER) ) {
            //if(((ke.getKeyChar() < '0') || (ke.getKeyChar() > '9')) && (ke.getKeyChar() != 8) && (ke.getKeyChar() != 127) && (ke.getKeyChar() != 10) ) {
                {System.out.println("e");
                ke.consume();}
            }
    }
}


SWING:
import java.awt.*;
import java.awt.event.*;

public class NumberTextField extends TextField implements KeyListener
{
    NumberTextField(){this(10);}

    NumberTextField(int sendSize)
    {
        super(sendSize);
        this.addKeyListener(this);
    }

    public void keyPressed (KeyEvent ke)
    {
        if (!ke.isActionKey() && ke.getKeyCode()!=KeyEvent.VK_DELETE && ke.getKeyCode()!=KeyEvent.VK_BACK_SPACE)
            // Tjek om keyCode er et tal?
            if (ke.getKeyCode()<KeyEvent.VK_0 || ke.getKeyCode()>KeyEvent.VK_9) {
                // Hvis nej consume()
                ke.consume();
        }
    }
    public void keyReleased(KeyEvent ke){}
    public void keyTyped(KeyEvent ke){}
}

Fundet her: http://www.eksperten.dk/spm/341667 Hvor Arne hjalp mig i tidernes morgen med at få lavet AWT klassen om til en swing....
Avatar billede supa Nybegynder
04. marts 2005 - 12:34 #6
Dette var hvad jeg gjorde:
public void keyTyped(KeyEvent e){
    if(textRooms.hasFocus() || textSize.hasFocus() || textZipCode.hasFocus()){
        char c = e.getKeyChar();     
        if(!((Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) || (c == KeyEvent.VK_DELETE)))){
            getToolkit().beep();
            e.consume();
        }
    }
}

Hvis jeg lavede den i KeyPressed(KeyEvent e), så ignorede den bare e.consume().. Jeg lavede godt nok mine JTextFields om til JFormattedTextFields, men jeg udnytter dem ikke, for nu virker det her for mig.. :)
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