Обработка исключений "разрешены только цифры", ошибка перед нажатием Enter. Зачем? - PullRequest
0 голосов
/ 04 января 2012

Когда я запускаю программу, я получаю всплывающее окно, и когда я вписываю число в число 1 или номер 2, обработка исключений выдает мне ошибку «разрешены только цифры», прежде чем я нажимаю клавишу «ввод».Это продолжается, пока я не заполню число в обоих текстовых полях.Он не должен давать мне ошибок, если я не помещаю в текстовые поля кроме цифр.Также.Я не могу конвертировать из CM в INCH дважды, это снова выдаст ошибку.Я должен переключаться между преобразованием из CM в INCH и INCH в CM.Конвертируется нормально, поэтому проблема должна быть в настройке обработки исключений?Как будто он читает текстовое поле, прежде чем я нажимаю клавишу ввода, и поэтому выдает ошибку, потому что номер не вставлен.

Может кто-нибудь помочь мне?Заранее спасибо!

// Даниил

У меня 2 класса.

Код для класса 1:

package inchcm;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class InchCM extends JFrame {

    private JTextField num1 = new JTextField(8);
    private JTextField num2 = new JTextField(8);
    private JLabel l1 = new JLabel();
    private JLabel l2 = new JLabel();

    public InchCM() {


        setLayout(new BorderLayout());

        //panel 1 med GridLayout (2,0) til 2 x JTextField(8).
        JPanel p1 = new JPanel(new GridLayout(2, 0));
        p1.add(new JLabel(""));
        p1.add(num1);
        p1.add(new JLabel(""));
        p1.add(num2);


        JPanel p2 = new JPanel(new GridLayout(2, 0));
        p2.add(new JLabel(" Inches"));
        p2.add(l1);
        p2.add(new JLabel(" Centimeters"));
        p2.add(l2);


        add(p1, BorderLayout.EAST);
        add(p2, BorderLayout.WEST);


        num1.addKeyListener(
                new KeyAdapter() {

                    public void keyReleased(KeyEvent e) {

                        try {

                            double nummer1 = Double.parseDouble(num1.getText());
                            double nummer2 = Double.parseDouble(num2.getText());

                            Udregning udr = new Udregning(nummer1, nummer2);


                            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                                num2.setText(String.format("%.2f", udr.inchtocm()));
                            }                            
                        } 
                        //end tal i et af JTextFieldsne.
                        catch (NumberFormatException ex) {
                            System.out.println(ex);
                            JOptionPane.showMessageDialog(null,
                                    "Only numbers allowed \nTry again",
                                    "Input error", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });



        num2.addKeyListener(
                new KeyAdapter() {                    

                    public void keyReleased(KeyEvent e) {

                        try {
                            //objekt af num1 og num2.
                            double nummer1 = Double.parseDouble(num1.getText());
                            double nummer2 = Double.parseDouble(num2.getText());

                            Udregning udr = new Udregning(nummer1, nummer2);


                            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                                num1.setText(String.format("%.2f", udr.cmtoinch()));
                            }                            
                        } 

                        catch (NumberFormatException ex) {
                            System.out.println(ex);
                            JOptionPane.showMessageDialog(null,
                                    "Only numbers allowed \nTry againn",
                                    "Input error", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });

    }

    public static void main(String[] args) {


        InchCM frame = new InchCM();
        frame.pack();
        frame.setTitle("InchCM");
        frame.setSize(300, 130);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

Код для класса 2: «Класс расчета»

package inchcm;

public class Udregning {

    private double num1 = 0;
    private double num2 = 0;

    Udregning() {
    }

    Udregning(double newnum1, double newnum2) {
        setnum1(newnum1);
        setnum2(newnum2);
    }

    private void setnum1(double newnum1) {
        num1 = newnum1;
    }

    private void setnum2(double newnum2) {
        num2 = newnum2;
    }

    public double inchtocm() {
        double result;
        result = num1 * 2.54;
        return result;
    }

    public double cmtoinch() {
        double result;
        result = num2 * .39;
        return result;
    }
}

Ответы [ 3 ]

1 голос
/ 04 января 2012

Как я здесь недавно узнал, нет необходимости в KeyListener для достижения этого поведения. Вы должны добавить ActionListener к JTextField, который будет срабатывать при нажатии ENTER в текстовом поле.

Если вы хотите запустить действие для другой клавиши, а затем клавиши ENTER, вам следует использовать сочетания клавиш вместо KeyListener. См. Учебник Swing

0 голосов
/ 04 января 2012

Я могу согласиться с ответом @mcfinnigan, но, кроме того, в обработчике событий num1 вы не должны реагировать на num2. Если вы хотите обновить каждый ключ:

 num1.addKeyListener(
            new KeyAdapter() {

                public void keyReleased(KeyEvent e) {

                    try {
                        double nummer1 = Double.parseDouble(num1.getText());

                        // Synchronize both fields:
                        try {
                            double nummer2 = Double.parseDouble(num2.getText());

                            Udregning udr = new Udregning(nummer1, nummer2);
                            //if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                                num2.setText(String.format("%.2f", udr.inchtocm()));
                            //}                            
                        } catch (NumberFormatException ex2) { }


                    } 
                    //end tal i et af JTextFieldsne.
                    catch (NumberFormatException ex) {
                        System.out.println(ex);
                        JOptionPane.showMessageDialog(null,
                                "Only numbers allowed \nTry again",
                                "Input error", JOptionPane.ERROR_MESSAGE);
                    }
                }
            });
0 голосов
/ 04 января 2012

Ваш блок try catch выполняется каждый раз, когда вызывается событие KeyReleased - то есть при каждом нажатии клавиши.Вам нужно изменить его, чтобы проверить VK_ENTER, прежде чем пытаться проанализировать введенный номер:

try {
    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
        double nummer1 = Double.parseDouble(num1.getText());
        double nummer2 = Double.parseDouble(num2.getText());

        Udregning udr = new Udregning(nummer1, nummer2);
        num2.setText(String.format("%.2f", udr.inchtocm()));
    }                            
} 
//end tal i et af JTextFieldsne.
catch (NumberFormatException ex) {
    System.out.println(ex);
    JOptionPane.showMessageDialog(null,
            "Only numbers allowed \nTry again",
            "Input error", JOptionPane.ERROR_MESSAGE);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...