2014-12-06 28 views
0

我正在寫一個程序來模擬校園學生的等待隊列這個程序用戶鏈接列表做隊列,我用一個按鈕單擊事件來執行碼。有沒有辦法在Java GUI程序中的內存中保留隊列數據

它每次只能工作一次只能保存一個學生我認爲這是因爲按鈕點擊事件後清單被清除。我只想知道有沒有辦法讓列表保持活動狀態直到我終止主程序。

我下面的代碼:

private void addStd1ActionPerformed(java.awt.event.ActionEvent evt) {           
      Queue stdQue = new LinkedList(); <-- Create the queue 

      String stName = addStdName.getText(); 

      int sId; 
      int stdQuality; 


      if(!stName.isEmpty()){ 
// Generate a random number as Id 
      RanNum tempId = new RanNum(); 
      sId = tempId.genNum(); 

// Generate a random number as a quality number to be matched later with the apartment 
      RanNum tempQuality = new RanNum(); 
      stdQuality = tempQuality.genNum(); 

      //StdDetails sTn = new StdDetails(sId, stName, stdQuality); 
      stdQue.add(sId); 
      stdQue.add(stdQuality); 
      stdQue.add(stName); 

      Object atTop = stdQue.element().toString(); 

      if (!stdQue.isEmpty()){ 
       crntTop.setText("Current top of the list: " + atTop + " Student ID: " + sId); 
       addStdName.setText(""); 

      }else{ 
       crntTop.setText("Queue list is empty."); 
      } 
      }else{ 
       crntTop.setText("Please, enter student name."); 
      } 

      if(!stdQue.isEmpty()){ 
       for(Object name : stdQue){ 
       lstQue.setText(name.toString()); 
       }    
      } 
     } 

的用了錯誤上面的代碼功能,我只是想找出保持隊列現場,直到用戶終止主程序。

我認爲這可以使用while循環在CLI程序中存檔,但這是一個GUI程序,我不知道如何以這種格式來做到這一點。

UPDATE 我做了根據@learninloop當我這樣做,我得到一個錯誤的變化「無法查找符號:方法addStd1ActionPerformed(EVT)」。還想告訴你,我正在使用NetBeans 8.0.2作爲我的Java IDE。

addStd1.setText("Add Student"); 
addStd1.addActionListener(new java.awt.event.ActionListener() { 
public void actionPerformed(java.awt.event.ActionEvent evt) {addStd1ActionPerformed(evt);} 

且變更後的主要代碼如下:

class stdQueCls{ 
     Queue stdQue;    
     public stdQueCls(){ 
      stdQue = new LinkedList(); 
     } 
    private void addStd1ActionPerformed(java.awt.event.ActionEvent evt) {           
     /*AddStdFrm newWindow = null; 
     newWindow = new AddStdFrm(); 
     newWindow.setVisible(true); 
     this.setVisible(false);*/ 
     String stName = addStdName.getText(); 


     if(!stName.isEmpty()){ 

     //StdDetails sTn = new StdDetails(sId, stName, stdQuality); 

      int sId; 
      int stdQuality; 

      RanNum tempId = new RanNum(); 
      sId = tempId.genNum(); 

      RanNum tempQuality = new RanNum(); 
      stdQuality = tempQuality.genNum(); 

      stdQue.add(sId); 
      stdQue.add(stdQuality); 
      stdQue.add(stName); 

     Object atTop = stdQue.element().toString(); 

     if (!stdQue.isEmpty()){ 
      crntTop.setText("Current top of the list: " + atTop + " Student ID: " + sId); 
      addStdName.setText(""); 

     }else{ 
      crntTop.setText("Queue list is empty."); 
     } 
     }else{ 
      crntTop.setText("Please, enter student name."); 
     } 

     if(!stdQue.isEmpty()){ 
      for(Object name : stdQue){ 
      lstQue.setText(name.toString()); 
      }    
     }   
    }          
    } 

UPDATE 我改變了代碼,放在一類我的鏈接列表,並移動它完全脫離按鈕點擊事件的。因此,新的代碼如下所示,

class stdQueCls{ 
     Queue stdQue;    
     public stdQueCls(){ 
      stdQue = new LinkedList(); 

      if (!stdQue.isEmpty()){ 
      for(Object all : stdQue){ 
      lstQue.setText(all.toString()); 
      } 
      } 
     } 
    } 
    public void addStd1ActionPerformed(java.awt.event.ActionEvent evt) {           
     /*AddStdFrm newWindow = null; 
     newWindow = new AddStdFrm(); 
     newWindow.setVisible(true); 
     this.setVisible(false);*/ 
     String stName = addStdName.getText(); 


     if(!stName.isEmpty()){ 

     //StdDetails sTn = new StdDetails(sId, stName, stdQuality); 
      stdQueCls stdQue1 = new stdQueCls(); 
      int sId; 
      int stdQuality; 

      RanNum tempId = new RanNum(); 
      sId = tempId.genNum(); 

      RanNum tempQuality = new RanNum(); 
      stdQuality = tempQuality.genNum(); 

      stdQue1.stdQue.add(sId); 
      stdQue1.stdQue.add(stdQuality); 
      stdQue1.stdQue.add(stName); 

    Object atTop = stdQue1.stdQue.element().toString(); 

    if (!stdQue1.stdQue.isEmpty()){ 
    crntTop.setText("Current top of the list: " + atTop + " Student ID: " + sId); 
    addStdName.setText(""); 

    }else{ 
    crntTop.setText("Queue list is empty."); 
    } 
    }else{ 
    crntTop.setText("Please, enter student name."); 
} 
} 

現在,當你在我的課看到我想在隊列名爲queLst文本區域顯示以往有什麼你可以看到我使用了一個for循環做,但我的問題是它不是在文本區域顯示列表,而是將其放置在按鈕單擊事件中,但它增加了我在此處輸入的內容,可以讓我知道如何將其存檔。

UPDATE 我做了一些修改上面的代碼,現在它的工作,但我不知道如果我這樣做是錯誤的事情之一是,當我檢索它不是我所期望看到的隊列中插入的數據而且我認爲我的隊列鏈表還沒有被填充。

有人可以看看我的代碼,並告訴我我在做什麼是寫或錯。

class stdQueCls{ 
     Queue<stdDetailGroup> stdQue;    
     public stdQueCls(){ 
      stdQue = new LinkedList<stdDetailGroup>(); 
      //lstQue.setText(stdQue.toString()); 
     } 
    } 

    class stdDetailGroup{ 
      String stdId; 
      String stQuality; 
      String stdName; 
    public stdDetailGroup(String a, String b, String c){ 
     stdId = a; 
     stQuality = b; 
     stdName = c; 
    } 
    } 
    public void addStd1ActionPerformed(java.awt.event.ActionEvent evt) {           
     /*AddStdFrm newWindow = null; 
     newWindow = new AddStdFrm(); 
     newWindow.setVisible(true); 
     this.setVisible(false);*/ 

     String stName = addStdName.getText(); 


     if(!stName.isEmpty()){ 

     //StdDetails sTn = new StdDetails(sId, stName, stdQuality); 
      stdQueCls stdQue1 = new stdQueCls(); 

      int stdQualityInt; 
      int sIdInt; 
      String sId; 
      String stdQuality; 

      RanNum tempId = new RanNum(); 
      sIdInt = tempId.genNum(); 
      sId = Integer.toString(sIdInt); 

      RanNum tempQuality = new RanNum(); 
      stdQualityInt = tempQuality.genNum(); 
      stdQuality = Integer.toString(stdQualityInt); 

      stdDetailGroup stdDetailsAdd = new stdDetailGroup(sId, stdQuality, stName); 
      stdQue1.stdQue.add(stdDetailsAdd); 

      Object atTop = stdQue1.stdQue.toString(); 

     if (!stdQue1.stdQue.isEmpty()){ 
      crntTop.setText("Current top of the list: " + atTop + " Student ID: " + sId); 
      addStdName.setText(""); 

     }else{ 
      crntTop.setText("Queue list is empty."); 
     } 
     }else{ 
      crntTop.setText("Please, enter student name."); 
     } 

    }          

    private void shwQue1ActionPerformed(java.awt.event.ActionEvent evt) {           
     stdQueCls stdQue2 = new stdQueCls(); 

     lstQue.setText(stdQue2.stdQue.toString()); 
    } 

回答

0

正如你所創建按鈕的操作進行事件中LinkedList的對象stdQue,結果收到了創建該對象,並重新初始化所有的按鈕被點擊的時間。要使數據持久化,請在按鈕單擊事件之外創建對象。

假設類名爲StudentManager,您可以創建在構造函數中的對象:

class StudentManager { 
    Queue stdQue; 
    public StudentManager() { 
     stdQue = new LinkedList(); <-- Create the queue 
    } 
    private void addStd1ActionPerformed(java.awt.event.ActionEvent evt) 
    { 
     . 
     . 
     stdQue.add(sId); 
     stdQue.add(stdQuality); 
     stdQue.add(stName); 
     . 
     . 
    } 
} 
+0

啊非常感謝你。我仍然在學習java,有時候我的問題可能達不到標準,非常感謝你的答覆。 – Sand 2014-12-07 03:05:27

+0

我做了你的建議,但我得到「找不到符號:方法addStd1ActionPerformed(evt)」 addStd1.setText(「Add Student」); addStd1.addActionListener(新java.awt.event.ActionListener(){ 公共無效的actionPerformed(EVT java.awt.event.ActionEvent中){addStd1ActionPerformed(EVT);} 臨屋,我得到了錯誤的區域 – Sand 2014-12-07 05:05:40

+0

@Jack你已經在'stdQueCls'類以外的地方使用了'addStd1ActionPerformed'方法,只需要驗證一次開啓和關閉的括號 – learningloop 2014-12-08 06:06:30

相關問題