2017-09-17 6 views
0

私はJavaFXMLアプリケーションを作成しています。これらのクラスをそこに置く必要があります:ListOfAllEvents、Events and Instructors。 ListOfAllEventsにはEventsのArrayListがあり、各EventにはInstructorのArrayListがあります。java ArrayListはただ1つの要素を追加しています

ボタンをクリックしてインスタンスを作成するメソッドを使用するまず、いくつかのインストラクタを作成してArrayList CurrentInstructorsに追加し、Eventのインスタンスを作成し、インストラクタのリストを割り当てて追加します。 ArrayList CurrentEventsへの私の新しいイベント。

私の問題は、CurrentEventsは1つのイベントだけを追加し、2回目に新しいイベントを作成するメソッドを呼び出すと、2番目のイベントは、現在のCurrentInstructorsが正しく動作しても最初のイベントを置き換えます。

私を助けることができますか?私はJavaの初心者ですから、すべてのアドバイスに感謝します。

マイコード:

public class FXMLDocumentController implements Initializable { 
(...) 
private ArrayList<Instructor> CurrentInstructors = new ArrayList<Instructor>(); 
private ArrayList<Event> CurrentEvents = new ArrayList<Event>(); 

@FXML 
private void AddInstructor_Click(ActionEvent event) { 
    TextInputDialog dialog = new TextInputDialog(""); 

    Optional<String> result = dialog.showAndWait(); 
    if (result.isPresent()){ 
     Instructor newInstructor = new Instructor(result.get()); 
     CurrentInstructors.add(newInstructor); 

    } 
} 


private void NewEvent() { 
Event newEvent = new Event(EventName.getText()); 

//this is the problematic row: 
CurrentEvents.add(newEvent); 

newEvent.setInstructors(CurrentInstructors); 

CurrentInstructors.clear(); 

} 
(...) 
} 

インストラクタークラス:

public class Instructor { 
private String name; 

public String getName() { 
    return name; 
} 
public Instructor(String name){ 
    this.name = name; 

} 

} 

イベント・クラス:

public class Event { 
private String name; 
private ArrayList<Instructor> Instructors = new ArrayList<Instructor>(); 

public Event(String name){ 
    this.name = name; 
} 
//getters, setters 

} 
+2

まともな回答を得るためには、有効な[mcve]を作成して投稿したいと思うでしょう。これはあなたのプログラム全体ではなく、むしろここに投稿するのに十分小さい新しい**小さな**プログラム、私たちにとって問題を示すものです。 –

+3

要素を削除したくない場合は、 'CurrentInstructors.clear();'を使用しないでください。 –

+0

ようこそ! [ツアー](ツアー)を見て回り、 [ヘルプセンター](/ help)、特に [よくある質問はどうすればよいですか?](/ help/how )、そして[ここではどのような話題について聞くことができますか?](/ help/on-topic) [Java命名規則](http://www.oracle.com/technetwork/java/codeconventions-135099.html)を読んで従ってください。 –

答えて

2

あなただけがすぐに空に、その後、設定されている1つのリストを持っています。

newEvent.setInstructors(CurrentInstructors); 
CurrentInstructors.clear(); // This clears the list just set to newEvent 

Javaはpass-by-valueあるので、あなたは複数の参照を持つ単一Listオブジェクト

にあなたはそれが自分のリストです保持するために、それぞれの新しいイベントをしたい場合は、明示的に作られたnew ArrayList<>()newEventオブジェクトを作成する必要があり、その後、ことに追加して、例えばsetInstructors

を呼び出し、

private void newEvent(String name) { 
    Event newEvent = new Event(name); 
    // Copy the list 
    List<Instructor> instructors = new ArrayList<>(currentInstructors); 
    // Set that list 
    newEvent.setInstructors(instructors); 
    currentEvents.add(newEvent); 
    // Now clearing this list won't clear the newEvent list 
    currentInstructors.clear(); 
} 
関連する問題