2013-08-06 2 views
0

추가 된 숫자의 평균을 계산하는 프로그램을 만들고 있습니다. 프로그램은 정상적으로 계산하지만 예외 처리기를 추가하려고하면 실패합니다. 숫자를 넣으면 작동하지만 빈 공간이나 다른 기호를 입력하면 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); 
    } 
} 

답변

4

그냥, 당신은 루프를 필요로하지 않는, 스윙에서 do-while 루프를 제거하려면 명령 줄을 것 아니에요 .

제거하기 :

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) 
    //......... 
    
+0

거의 제거 할 때 작동합니다. 그러나 오류가 발생하면 모든 계산이 중지됩니다. –

+0

@ MartynasŽukovas 그게 당신이 기대하는 것입니다. 하나의 오류가 발생하자마자 멈추고 사용자에게 문제를 해결하도록 요청해야합니다. 그런 다음 제출 버튼을 다시 눌러야합니다 ... – MadProgrammer

+1

@ MartynasŽukovas : 업데이트를 확인하십시오 – Azad

2

여기에 완전히 대화 팝업을 탈출하는 솔루션입니다 : 사용 JFormattedTextField 대신 JTextField을. 이것은 자동으로 입력 오류를 처리합니다. 잘못된 값을 입력하면 기본적으로 유효하지 않은 값이 마지막 유효 값으로 대체되지만 setFocusLostBehavior으로 변경할 수 있습니다. 인자없는 생성자를 사용하여 필드를 생성 한 다음 setValue(new Integer(0))을 호출하여 사용하십시오. 필드의 번호를 알아야 할 경우 (Integer) getValue()을 사용할 수 있습니다.