有没有办法在Java GUI程序中将队列数据保存在内存中

时间:2014-12-06 16:34:36

标签: java user-interface swt

我正在编写一个程序来模拟校园学生的等待队列,该程序使用链接列表来执行队列,并使用按钮单击事件来执行代码。

每次添加时它只工作一次只有一个学生我认为它因为列表在按钮点击事件后被清除。我只是想知道有没有办法让列表保持活动状态,直到我终止主程序。

我的代码如下:

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程序,我不知道如何以这种格式执行此操作。

更新 当我这样做时,我根据@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());   
            }            
        }        
    }                                       
    }

更新 我更改了代码并将链接列表放入类中,并将其完全移出按钮单击事件。所以新代码如下,

    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循环来执行此操作,但我的问题是它没有在文本中显示列表区域和另一件事,当它被放置在按钮点击事件中它工作,但添加我在那一点输入的一些可以有人告诉我一个方法或提出如何存档这个。

更新 我对上面的代码进行了一些更改,现在它正在工作,但我不知道如果我做错了一件事就是当我从队列中检索插入的数据时它不是我期望看到的,我认为仍然是我的队列链表没有人口稠密。

有人可以看看我的代码并告诉我我在做什么是写或错。

  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());
    }

1 个答案:

答案 0 :(得分:0)

当您在按钮的动作执行事件中创建链接列表对象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);
      .
      .
   }
}