Java swing 异常处理程序

标签 java swing exception error-handling jtextfield

我正在制作计算添加数字平均值的程序。程序计算正常,但是当我尝试添加异常处理程序时,我失败了。当我输入数字时,它工作正常,但是当我提交空白或其他符号时,每次我转动“push OK”或“x”时,我的错误消息都会弹出。我只是想在犯错误时(提交空白或其他符号)时收到带有错误的弹出消息,按“确定”,然后继续添加新数字,而不会出现任何计算错误。

整个程序:

主要

package average;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Main extends JFrame{
    public static void main (String []args){

        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JFrame frame = new JFrame("Created by Mac4s");
                frame.setLayout(new BorderLayout());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
                frame.setSize(300,220);
                frame.setResizable(true);

                Surface surfObj = new Surface();
                frame.add(surfObj);         
            }
        }); 
    }
}

表面

package average;

import java.awt.Color;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;

public class Surface extends JLabel{
    private JTextField numberTxtFld;
    private JLabel topLabel;
    private JLabel sumLabel;
    private JLabel avgLabel;
    private JLabel maxLabel;
    private JLabel minLabel;
    private JLabel amountLabel;
    private JLabel listLabel;
    private JLabel resultLabel;
    private JLabel sumAnswerFld;
    private JLabel avgAnswerFld;
    private JLabel maxAnswerFld;
    private JLabel minAnswerFld;
    private JLabel amountAnswerFld;
    private JLabel fullListLabel;
    private JList fullList;
    final List<String> numbersList = new ArrayList<String>();
    private JButton submitBtn;
    private JButton closeBtn;
    private JPanel panel;

    private DefaultListModel defaultListModel;

    private int arrayIndex = 0;// used for components adding into array

    public Surface(){   
        defaultListModel = new DefaultListModel();

        panel = new JPanel();
        panel.setBackground(Color.WHITE);
        panel.setSize(290, 180);

        panel.setLayout(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;

        topLabel = new JLabel("Enter your number and push submit");
        topLabel.setFont(new Font("Serif", Font.BOLD, 16));

        gbc.gridwidth = 3;
        gbc.gridx = 0; // column 
        gbc.gridy = 0; // row
        panel.add(topLabel, gbc);
        gbc.gridwidth = 1; // setting grid column with to default

        fullListLabel = new JLabel("Full list");
        fullListLabel.setFont(new Font("Serif", Font.BOLD, 16));
        gbc.gridx = 2;
        gbc.gridy = 1;
        panel.add(fullListLabel, gbc);

        resultLabel = new JLabel("Result: ");
        resultLabel.setFont(new Font("Serif", Font.BOLD, 16));
        gbc.gridwidth = 2;
        gbc.gridx = 0;
        gbc.gridy = 2;
        panel.add(resultLabel, gbc);
        gbc.gridwidth = 1; // setting grid column with to default

        avgLabel = new JLabel("Average");
        avgLabel.setFont(new Font("Serif", Font.BOLD, 12));
        gbc.gridx = 0;
        gbc.gridy = 3;
        panel.add(avgLabel, gbc);

        sumLabel = new JLabel("Total");
        sumLabel.setFont(new Font("Serif", Font.BOLD, 12));
        gbc.gridx = 0;
        gbc.gridy = 4;
        panel.add(sumLabel, gbc);

        amountLabel = new JLabel("Amount");
        amountLabel.setFont(new Font("Serif", Font.BOLD, 12));
        gbc.gridx = 0;
        gbc.gridy = 5;
        panel.add(amountLabel, gbc);

        maxLabel = new JLabel("Max");
        maxLabel.setFont(new Font("Serif", Font.BOLD, 12));
        gbc.gridx = 0;
        gbc.gridy = 6;
        panel.add(maxLabel, gbc);

        minLabel = new JLabel("Min");
        minLabel.setFont(new Font("Serif", Font.BOLD, 12));
        gbc.gridx = 0;
        gbc.gridy = 7;
        panel.add(minLabel, gbc);

        avgAnswerFld = new JLabel(" 0");
        avgAnswerFld.setFont(new Font("Serif", Font.BOLD, 12));
        gbc.gridx = 1;
        gbc.gridy = 3;
        panel.add(avgAnswerFld, gbc);

        sumAnswerFld = new JLabel(" 0");
        sumAnswerFld.setFont(new Font("Serif", Font.BOLD, 12));
        gbc.gridx = 1;
        gbc.gridy = 4;
        panel.add(sumAnswerFld, gbc);

        amountAnswerFld = new JLabel(" 0");
        amountAnswerFld.setFont(new Font("Serif", Font.BOLD, 12));
        gbc.gridx = 1;
        gbc.gridy = 5;
        panel.add(amountAnswerFld, gbc);

        maxAnswerFld = new JLabel(" 0");
        maxAnswerFld.setFont(new Font("Serif", Font.BOLD, 12));
        gbc.gridx = 1;
        gbc.gridy = 6;
        panel.add(maxAnswerFld, gbc);

        minAnswerFld = new JLabel(" 0");
        minAnswerFld.setFont(new Font("Serif", Font.BOLD, 12));
        gbc.gridx = 1;
        gbc.gridy = 7;
        panel.add(minAnswerFld, gbc);

        numberTxtFld = new JTextField();
        numberTxtFld.setColumns(10);
        numberTxtFld.setFont(new Font("Serif", Font.PLAIN, 16));
        gbc.ipady = 10;
        gbc.ipadx = 60;
        gbc.gridx = 0;
        gbc.gridy = 1;
        panel.add(numberTxtFld, gbc);

        fullList = new JList(defaultListModel);
        fullList.setVisibleRowCount(6);
        fullList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        gbc.gridheight = 6;
        gbc.gridx = 2;
        gbc.gridy = 2;
        panel.add(new JScrollPane(fullList), gbc);
        gbc.gridheight = 1; // setting grid column with to default

        submitBtn = new JButton("Submit");
        gbc.ipady = 10;
        gbc.ipadx = 10;
        gbc.gridx = 1;
        gbc.gridy = 1;
        submitBtn.addActionListener(
            new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent event) {
                    boolean error = false;
                    do{
                        try{
                            defaultListModel.clear(); // clear screen and then add new list
                            String text = numberTxtFld.getText();
                            numbersList.add(text);
                            for (Object x : numbersList) {
                                defaultListModel.addElement(x);
                            }   
                            numberTxtFld.setText("");

                            int amount = defaultListModel.getSize(); // amount of added numbers
                            double sum = 0;// total sum of added numbers
                            for (Object x : numbersList) {
                                sum = sum + Integer.parseInt((String) x);
                            }
                            double average = sum / amount; // calculate average number
                            int max = -2147483647; // calculate maximal number
                            for (Object x : numbersList) {
                                if (max <= Integer.parseInt((String) x))
                                    max = Integer.parseInt((String) x);
                            }
                            int min = 2147483647; // calculate min number
                            for (Object x : numbersList) {
                                if (min >= Integer.parseInt((String) x))
                                    min = Integer.parseInt((String) x);
                            }
                            sumAnswerFld.setText(Double.toString(sum));// total sum of added numbers

                            amountAnswerFld.setText(Integer.toString(amount));// amount of added numbers

                            avgAnswerFld.setText(String.format("%.3f", average)); // calculate average number

                            maxAnswerFld.setText(Integer.toString(max));// write maximal

                            minAnswerFld.setText(Integer.toString(min)); // write minimal
                            error = true;
                        } catch (Exception e){
                            JOptionPane.showMessageDialog(null, "Wrong input, try again" , "Error", JOptionPane.PLAIN_MESSAGE);
                        }
                    }while(error == false);
                }// action performed end                    
            }// new  action listener end
        );  // submitbtn.action listener end    
        panel.add(submitBtn, gbc);

        add(panel);
    }
}

最佳答案

只需删除do-while循环,在swing中,你不需要循环,它不像命令行。

删除这个:

do{

....} while(error==true);

您有很多遗漏,但更正了您的代码。

  1. 删除try-catch
  2. 将以下几行添加到您的代码中:

    // clear screen and then add new list
    String text = numberTxtFld.getText();
    boolean isNumber = false;
    try{
        Integer.parseInt(text);
        numbersList.add(text);
        isNumber = true;
    } catch(NumberFormatException ex){
        //JOptionPane.show.......
        numberTxtFld.setText("");
    }
    if(isNumber){
    defaultListModel.clear();
    for (Object x : numbersList) 
    //......... 
    

关于Java swing 异常处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18078101/

相关文章:

java - 为什么更高分辨率的 BufferedImage 会被包装并压缩在 Canvas 中?

c# - 异常的三元运算符?其他选择?

PHP PDOException -- 无效参数编号 : Columns/Parameters are 1-based

java - 从 ActionListener 获取按钮名称?

java - 我怎样才能用java中的这个锯齿状数组制作这个例子

java - 如何将自动完成文本字段分配给 JTable 单元格?

Java Swing 线程问题

c++ - 在 C++ 异常的 what() 中构建字符串

java - 在 servlet 中读取 JSON 字符串

Java抽象类方法