2016-07-06 68 views
1

我意識到我做了一個無限循環,每次我進入該循環時,我的取消按鈕不起作用,對話框不斷彈出。我如何使取消按鈕功能

下面的代碼

String buffer = " "; //Input a string into console 
    boolean badInput = true; 
    boolean badInput2 = true; 
    String idNum = ""; //ask for id number 
    String skill = ""; // ask for skill number 
    int skillInt = 0; // skill is an int 

    //prompt user for file location 
    File loc = new File(JOptionPane.showInputDialog(null, "Please provide the file location: ")); 
    RandomAccessFile store = new RandomAccessFile(loc, "rw"); 

    //prompt user for a command 
    String cmd = "start"; 
    int recLocation = 0; 
    while(cmd.compareToIgnoreCase("end")!=0){ //stay in program (loop) until end command is given 
     cmd = JOptionPane.showInputDialog(null, "Please input a command (new, old or end): "); 

     //creating new entry 
     if(cmd.compareToIgnoreCase("new")==0){ 
      while(badInput){ //keep them in loop until they give the input in the right format 
       idNum = JOptionPane.showInputDialog(null, "Please input an ID number (1 - 20): "); 
       // else JOptionPane.CANCEL_OPTIONsetDefaultCloseOperation(JOptionPane.EXIT_ON_CLOSE); 
       try{ 
        //corresponding int for ID number, which becomes the record location 
        //if number is not 1-20, code below 
        recLocation = Integer.parseInt(idNum); 
        if(recLocation<1 || recLocation>20){ 
         System.out.println("Please check that your number is between 1 and 20."); 
        }else{ 
         badInput = false; 
         break; 
        } 

       } 
       catch(NumberFormatException NF){ // if input isnt a number 
        System.out.println("Please check that your number is in the correct format."); 
       } 
      } 

      //ask for names 
      String pName = JOptionPane.showInputDialog(null, "Please input a player name: "); 
      String tName = JOptionPane.showInputDialog(null, "Please input a team name: "); 

      //ask for skill level 
      while(badInput2){ //keep them in the loop until they give the input in the right format 
       skill = JOptionPane.showInputDialog(null, "Please input a skill level (0 - 99): "); 
       try{ 
        //corresponding int for skill number, to check if in the right format 
        skillInt = Integer.parseInt(skill); 
        if(skillInt<0 || skillInt>99){ 
         System.out.println("Please check that your number is between 0 and 99."); 
        }else{ 
         badInput2 = false; 
         break; 
        } 

       } 
       catch(NumberFormatException NF){ //exception or error thrown if input is not in correct format 
        System.out.println("Please check that your number is in the correct format."); 
       } 
      } 

      String date = JOptionPane.showInputDialog(null, "Please input today's date (ex: 25Jun2014): "); 

      //formatting id number 
      if (idNum.length() < 2){ 
       idNum = idNum+buffer; 
      } 
      //formatting player name 
      if (pName.length() > 26){ 
       pName = pName.substring(0, 26); 
      } else { 
       while(pName.length() < 26){ 
        pName = pName+buffer; 
       } 
      } 

      //formatting team name 
      if (tName.length() > 26){ 
       tName = tName.substring(0, 26); 
      } else { 
       while(tName.length() < 26){ 
        tName = tName+buffer; 
       } 
      } 
      //formatting date 
      if (date.length() > 9){ 
       date = date.substring(0, 9); 
      } else { 
       while(date.length() < 9){ 
        date = date+buffer; 
       } 
      } 
      //formatting skill 
      if (skill.length() < 2){ 
       skill = skill+buffer; 
      } 
      //create full, identifying string 
      String fullRecord = idNum + " " + pName + tName + skill + " " + date; 
      store.seek((RECORD_LENGTH+2) * (recLocation-1)); 
      store.writeUTF(fullRecord); 

      //reset booleans 
      badInput = true; 
      badInput2 = true; 

     } 

     //accessing old entry 
     if(cmd.compareToIgnoreCase("old")==0){ 
      idNum = JOptionPane.showInputDialog(null, "Please input an ID number (1 through 20): ");  
      recLocation = Integer.parseInt(idNum); 
      store.seek((RECORD_LENGTH+2)*(recLocation-1)); 
      String fullRecord = store.readUTF(); 

      //interpret information from full string 
      try 
      {idNum = fullRecord.substring(0, 5); 
      String pName = fullRecord.substring(5, 31); 
      String tName = fullRecord.substring(31, 57); 
      skill = fullRecord.substring(57, 62); 
      String date = fullRecord.substring(62, 71); 
      System.out.println("ID: "+idNum+" NAME: "+pName+" TEAM: "+tName+" SKILL: "+skill+" DATE: "+date); 
      } 
      catch(StringIndexOutOfBoundsException S){ 
       System.out.println("No record found at that location."); 
      } 
     } 

     // JOptionPane.showMessageDialog(null, "good bye"); 
    } 

很抱歉,如果我沒有格式化這個權利。這是我第一次。我想知道如何讓取消按鈕退出循環。我嘗試使用if (cmd == null) System.exit(0);,但似乎不起作用。我真的是java的新手,我沒有經驗,所以請耐心等待。

+0

請參閱此頁:http://stackoverflow.com/help/mcve。這裏的關鍵是MINIMAL。換句話說,產生最少量的代碼可以讓我們重現問題。所有在你的循環中間的東西都是不相關的,只是使問題難以閱讀。 – nhouser9

回答

1

首先我建議使用equalsIgnoreCase作爲字符串比較,而不是compareIgnoreCase:https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#equalsIgnoreCase(java.lang.String)

while(!cmd.equalsToIgnoreCase("end")) { 

然後當)JOptionPane.showInputDialog的一個(的返回null這意味着他們會取消了,你可以有一個if語句將cmd字符串設置爲「結束」。我認爲儘管你應該儘量簡化循環,因爲它在一個區塊中有很多。這使得它很難調試。