2016-12-04 103 views
-3

我正在創建搜索表單。當用戶在textField中輸入一個字符串並單擊按鈕Search時,程序將瀏覽Vector,如果Vector有任何元素,其名稱與輸入字符串相同,則將該元素的名稱打印到控制檯。 如果Vector沒有元素,名稱LIKE爲輸入字符串,我將在Vector中添加一個名稱爲輸入字符串的新對象。 例如:當我在textField上輸入「John」並按下按鈕Search時,如果Vector有一個名稱爲「John」的元素,我將在控制檯上打印「John」。如果Vector沒有「John」,我會將一個名爲「John」的新學生添加到Vector中。
我的問題是,我把搜索功能放在btnSearch的動作監聽器中,但是搜索功能看起來像在按鈕的動作監聽器中不起作用。我試圖修復它一天的一半,但仍然不明白我錯了什麼。所以請幫助我!這裏是我的整個執行的程序:
*類組包含許多學生:在for循環中無法將新元素添加到Vector中

public class Group { 
protected Vector<Student> listStd; 

public Group() { 
} 

public Group(Vector<Student> listStd) { 
    this.listStd = listStd; 
} 

public Vector<Student> getListStd() { 
    return listStd; 
} 

public void setListStd(Vector<Student> listStd) { 
    this.listStd = listStd; 
} 

public void addStudent(Student std){ 
    listStd.add(std); 
    std.setGr(this); 
} 

public void search(String name){ 
    for(int i=0;i<this.getListStd().size();i++){ 
     if(this.getListStd().get(i).getName().equalsIgnoreCase(name)){ 
      System.out.println(this.getListStd().get(i).getName()); 
     } 
     else{ 
      this.getListStd().add(new Student(name)); 
      System.out.println("not found"); 
     } 
    } 
} 

public void print(){ 
    for(Student std:this.getListStd()){ 
     System.out.println(std.getName()); 
    } 
} 
} 
  • 類學生:

    執行用戶界面和主要功能
    public class Student { 
    protected String name; 
    protected Group gr; 
    
    public Student(){ 
    
    } 
    
    public Student(String name){ 
        this.name = name; 
    } 
    
    public void setName(String name){ 
        this.name = name; 
    } 
    
    public String getName(){ 
        return this.name; 
    } 
    
    public Group getGr() { 
        return gr; 
    } 
    
    public void setGr(Group gr) { 
        this.gr = gr; 
    } 
    
    
    
    @Override 
    public String toString() { 
        return this.getName(); 
    } 
    } 
    
  • UI類:

    public class UI extends JFrame{ 
    JTextField txtSearch; 
    Vector<Student> listStd; 
    JButton btnSearch,btnDisplay; 
    Group gr; 
    
    public UI(String title){ 
        super(title); 
        addControls(); 
        addEvents(); 
    } 
    
    public void addControls(){ 
        listStd = new Vector<Student>(); 
        gr = new Group(); 
        gr.setListStd(listStd); 
        gr.addStudent(new Student("Kurapika")); 
        gr.addStudent(new Student("Leorio")); 
        gr.addStudent(new Student("Hisoka")); 
        gr.addStudent(new Student("Meruem")); 
        gr.addStudent(new Student("Gon")); 
        gr.addStudent(new Student("Killua")); 
    
        Container con = getContentPane(); 
        JPanel pnMain = new JPanel(); 
        pnMain.setLayout(new BoxLayout(pnMain, BoxLayout.Y_AXIS)); 
    
        JPanel pnSearch = new JPanel(); 
        JLabel lblSearch = new JLabel("Write student name to search "); 
        txtSearch = new JTextField(10); 
        pnSearch.add(lblSearch); 
        pnSearch.add(txtSearch); 
        pnMain.add(pnSearch); 
    
        JPanel pnButton = new JPanel(); 
        btnSearch = new JButton("Search"); 
        btnDisplay = new JButton("Display"); 
        pnButton.add(btnSearch); 
        pnButton.add(btnDisplay); 
        pnMain.add(pnButton); 
    
    
        con.add(pnMain); 
    } 
    
    public void addEvents(){ 
        btnSearch.addActionListener(new ActionListener() { 
         @Override 
         public void actionPerformed(ActionEvent e) { 
          gr.search(txtSearch.getText()); 
         } 
        }); 
    
        btnDisplay.addActionListener(new ActionListener() { 
         @Override 
         public void actionPerformed(ActionEvent e) { 
          gr.print(); 
         } 
        }); 
    } 
    
    public void showWindow(){ 
        this.setSize(300,200); 
        this.setState(MAXIMIZED_BOTH); 
        this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
        this.setLocationRelativeTo(null); 
        this.setVisible(true); 
    } 
    
    public static void main(String[] args){ 
        UI ui = new UI("Test"); 
        ui.showWindow(); 
    } 
    } 
    
+2

「(爲什麼不是這個代碼的工作?「)尋求幫助調試問題」必須包括所期望的行爲,一具體問題或錯誤以及在問題本身中重現問題所需的最短代碼,而沒有明確問題陳述的問題對其他讀者沒有用處請參閱:如何創建[MCVE]「您擁有的是一個大代碼塊,沒有幾個細節。 – pvg

+0

我編輯了問題 –

+0

它仍然很混亂。嘗試將代碼降低到重現問題所需的絕對最低限度,並且清楚地描述您的問題 - 「不起作用」很難解釋。除了您的程序功能外,還要具體說明(包括任何錯誤等) - 您做了什麼,發生了什麼以及您的預期發生了什麼。 – pvg

回答

1

這也許可以(或者不)是你的問題的根源,但我還是要指出這個錯誤在你的代碼:

public void search(String name){ 
    for(int i=0;i<this.getListStd().size();i++){ 
     if(this.getListStd().get(i).getName().equalsIgnoreCase(name)){ 
      System.out.println(this.getListStd().get(i).getName()); 
     } 
     else{ 
      this.getListStd().add(new Student(name)); 
      System.out.println("not found"); 
     } 
    } 
} 

在你for -loop你實際上是在說,每個元素你必須檢查它的名字是否與給定的名字相同:如果它打印出來,否則你添加一個新成員。之後,轉到下一個元素並執行相同的操作。 所以,你正在爲做你的清單的所有元素。每當有一個元素與參數描述的名稱不同時,就會創建一個新的Student。你不應該在循環內創建新的元素。不僅你多次添加相同的名字,而且當你在循環條件下使用它的時候,你也會增加列表的大小!只有在完成檢查所有元素後,才能將元素添加到循環外的列表中。只有在完成檢查列表中的所有元素後,才能確定該名稱不存在。你只需要一個額外的布爾值來記憶它是否被發現。所以,你的代碼應該(至少)是這樣的:

public void search(String name){ 
    boolean found = false; 
    for(int i=0;i<this.getListStd().size();i++){ 
     if(this.getListStd().get(i).getName().equalsIgnoreCase(name)){ 
      System.out.println(this.getListStd().get(i).getName()); 
      found = true; 
     } 
    } 
    if(! found){ 
     this.getListStd().add(new Student(name)); 
     System.out.println("not found"); 
    } 
} 

這可能(不)解決您的問題。我至少想指出這個錯誤。 PS:通常,如果您在循環條件下使用該尺寸,請不要更改集合的大小(arraylist,set,...)! (除非它是真的真的真的你的意圖......但是這是罕見的)

好運

+0

它像奇蹟一樣工作,你救了我的生命朋友:(( 非常感謝你! ! –

相關問題