注册 登录
编程论坛 JAVA论坛

功能性错误,请各位帮忙!

yf453635634 发布于 2016-03-13 22:19, 2203 次点击
运行后,弹出的窗口 输入数字 会实现一个简单的加法运算,但总会把第一个加数丢失,请朋友们帮忙看看是什么原因!
程序代码:
package 练习代码;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.InputMismatchException;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Example9_17 {
    public static void main(String args[]) {
        WindowInput win = new WindowInput();
        win.setTitle("带输入对话框的窗口");
        win.setBounds(80, 90, 280, 300);
    }
}

class WindowInput extends JFrame implements ActionListener {
    JTextArea showResult;
    JButton openInput;
    String regex = "[\\d\\s]+";
   
    WindowInput() {
        openInput = new JButton("弹出输入对话框");
        showResult = new JTextArea();
        add(openInput, BorderLayout.NORTH);
        add(new JScrollPane(showResult), BorderLayout.CENTER);
        openInput.addActionListener(this);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        
        String str = JOptionPane.showInputDialog(this, "输入数字,用空格隔开", "输入对话框", JOptionPane.PLAIN_MESSAGE);
        if(str != null) {
            Scanner scanner = new Scanner(str);
            double sum = 0;
            int k = 0;
            String i = scanner.next();
            if(i.matches(regex)) {
                while(scanner.hasNext()) {
                    try{
                        double number = scanner.nextDouble();
                        if(k == 0)
                            showResult.append(""+number);
                        else
                            showResult.append("+"+number);
                        sum += number;
                        k++;
                    }
                    catch(InputMismatchException exp){
                        String t = scanner.next();
                    }
                }
                showResult.append("="+sum+"\n");
            }
            else
                JOptionPane.showMessageDialog(this, "请输入数字好吗", "警告", JOptionPane.WARNING_MESSAGE);
               
        }
    }
}
5 回复
#2
grmmylbs2016-03-14 11:08
因为你的 String i = scanner.next();已经把空格前的读出来了,我 改了一下,还是有点小bug,暂时没想出更好的方法
class WindowInput extends JFrame implements ActionListener {
     JTextArea showResult;
     JButton openInput;
     String regex = "[\\d\\s]+";
     
     WindowInput() {
         openInput = new JButton("弹出输入对话框");
         showResult = new JTextArea();
         add(openInput, BorderLayout.NORTH);
         add(new JScrollPane(showResult), BorderLayout.CENTER);
         openInput.addActionListener(this);
         setVisible(true);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }

     @Override
     public void actionPerformed(ActionEvent e) {
         // TODO Auto-generated method stub
        
         String str = JOptionPane.showInputDialog(this, "输入数字,用空格隔开", "输入对话框", JOptionPane.PLAIN_MESSAGE);
         if(str != null) {
             Scanner scanner = new Scanner(str);
             double sum = 0;
             int k = 0;
             //String i = scanner.nextLine();
             //if(i.matches(regex)) {
                 while(scanner.hasNext()) {
                     if (!scanner.hasNext(regex))
                     {
                         JOptionPane.showMessageDialog(this, "请输入数字好吗", "警告", JOptionPane.WARNING_MESSAGE);
                         return;
                     }
                     try{
                         double number = scanner.nextDouble();
                         if(k == 0)
                             showResult.append(""+number);
                         else
                             showResult.append("+"+number);
                         sum += number;
                         k++;
                     }
                     catch(InputMismatchException exp){
                         String t = scanner.next();
                     }
                 }
                 showResult.append("="+sum+"\n");
             //}
             //else
            //     JOptionPane.showMessageDialog(this, "请输入数字好吗", "警告", JOptionPane.WARNING_MESSAGE);
                 
         }
     }
 }
#3
grmmylbs2016-03-14 11:49
这样改了下,比较完美了
class WindowInput extends JFrame implements ActionListener {
     JTextArea showResult;
     JButton openInput;
     String regex = "[\\d\\s]+";
     
     WindowInput() {
         openInput = new JButton("弹出输入对话框");
         showResult = new JTextArea();
         add(openInput, BorderLayout.NORTH);
         add(new JScrollPane(showResult), BorderLayout.CENTER);
         openInput.addActionListener(this);
         setVisible(true);
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }

     @Override
     public void actionPerformed(ActionEvent e) {
         // TODO Auto-generated method stub
        
         String str = JOptionPane.showInputDialog(this, "输入数字,用空格隔开", "输入对话框", JOptionPane.PLAIN_MESSAGE);
         if(str != null) {
             Scanner scanner = new Scanner(str);
             double sum = 0;
             int k = 0;
             String i = scanner.nextLine();
             if(i.matches(regex)) {
                 Scanner scanner2 = new Scanner(i);
                 while(scanner2.hasNext()) {              
                     try{
                         double number = scanner2.nextDouble();
                         if(k == 0)
                             showResult.append(""+number);
                         else
                             showResult.append("+"+number);
                         sum += number;
                         k++;
                     }
                     catch(InputMismatchException exp){
                         String t = scanner2.next();
                     }
                 }
                 showResult.append("="+sum+"\n");
             }
             else
                 JOptionPane.showMessageDialog(this, "请输入数字好吗", "警告", JOptionPane.WARNING_MESSAGE);
                 
         }
     }
 }
#4
grmmylbs2016-03-14 11:57
既然是浮点数,那么正则应该改为String regex = "[\\d\\s\\.]+";
另外每个数还是要判断小数点的位置和个数
#5
yf4536356342016-03-14 17:39
回复 4楼 grmmylbs
嗯,你这样确实是解决了问题,不过步骤繁琐了一下。你说的小数点确实是我忘记啦哈哈,多谢前辈提醒!!  另一位前辈帮我改了一下,我觉着这个方法是不错的,你看一下代码
程序代码:

package 练习代码;

 
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.InputMismatchException;
import java.util.Scanner;

 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

 
public class Example9_17 {
    public static void main(String args[]) {
        WindowInput win = new WindowInput();
        win.setTitle("带输入对话框的窗口");
        win.setBounds(80, 90, 280, 300);
    }
}

 
class WindowInput extends JFrame implements ActionListener {
    JTextArea showResult;
    JButton openInput;
    String regex = "[\\d\\s]+";
     
    WindowInput() {
        openInput = new JButton("弹出输入对话框");
        showResult = new JTextArea();
        add(openInput, BorderLayout.NORTH);
        add(new JScrollPane(showResult), BorderLayout.CENTER);
        openInput.addActionListener(this);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

 
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
         
        String str = JOptionPane.showInputDialog(this, "输入数字,用空格隔开", "输入对话框", JOptionPane.PLAIN_MESSAGE);
        if(str != null) {
            Scanner scanner = new Scanner(str);
            double sum = 0;
            int k = 0;
          //  String i = scanner.next();
            if(str.matches(regex)) {
                while(scanner.hasNext()) {
                    try{
                        double number = scanner.nextDouble();
                        if(k == 0)
                            showResult.append(""+number);
                        else
                            showResult.append("+"+number);
                        sum += number;
                        k++;
                    }
                    catch(InputMismatchException exp){
                        String t = scanner.next();
                    }
                }
                showResult.append("="+sum+"\n");
            }
            else
                JOptionPane.showMessageDialog(this, "请输入数字好吗", "警告", JOptionPane.WARNING_MESSAGE);
                 
        }
    }
}
#6
grmmylbs2016-03-14 18:04
哦,我陷入Scanner scanner = new Scanner(System.in);里面了,没想到这个。
1