2016-12-04 11 views
-3

検索フォームを作成しています。ユーザがtextFieldに文字列を入力してSearchボタンをクリックすると、プログラムはVectorをブラウズします。Vectorには、入力文字列LIKEという名前の要素があれば、その要素の名前をコンソールに出力します。 Vectorに入力文字列LIKEという名前の要素がない場合、Vectorに入力文字列である名前の新しいオブジェクトを追加します。 例:textFieldに「John」と入力してボタン検索を押すと、「John」という名前の要素がある場合、コンソールに「John」と表示されます。 Vectorに "John"がない場合、その名前の "John"という新しいStudentを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()); 
    } 
} 
} 
  • クラスの学生:UIと主な機能を実行

    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

「(なぜこのコードは動作していない? ")デバッグ助けを求める質問は、」必要な動作を含める必要があり、あなた自身が持っているものは大きなコードのブロブであり、あなたが持っているものは、他の読者にとっては有用ではありません。いくつかの詳細はありません。 – pvg

+0

私は質問を編集しました –

+0

それはまだかなり混乱しています。問題を再現するために必要な最小限のコードを減らし、問題をはっきりと記述してください。「うまくいかない」と解釈するのは難しいです。あなたが持っているプログラム機能の概要のほかに、具体的に(エラーなどを含む) - あなたがしたこと、起こったこと、起こることを期待したこと。 – pvg

答えて

1

それは多分(またはそうでないかもしれない)問題の原因かもしれないが、私はまだあなたのコードでこのエラーを指摘する必要があります。あなたのfor

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

あなたが実際にあなたが各要素のことを言っている-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

それは奇跡のように動作し、私の人生の友人を救った:( ありがとう! ! –

関連する問題