2017-07-25 116 views
0

我似乎無法做到正確。我有一個listbox與類別項目。我還有一個數據模型,用於定義ID,名稱,姓氏,類別以及包含數據的ObservableList。我試圖更新現有對象,以防用戶點擊listbox中的同一項目並更改名稱,姓氏。防止ObservableList中的重複條目

這裏是我的代碼:

public class FXMLDocController implements Initializable { 

    ObservableList<String> listitems = FXCollections.observableArrayList(
             "Visual Basic", "ASP.net", "JavaFX"); 
    ObservableList<Persons> personData = FXCollections.observableArrayList(); 
    Persons pp = new Persons(); 

    private Label label; 
    @FXML 
    private TextField txtName; 
    @FXML 
    private TextField txtLastName; 
    @FXML 
    private Button btnSave; 
    @FXML 
    private TextArea txtArea; 
    @FXML 
    private ListView<String> listview = new ListView<String>(); 
    @FXML 
    private Button btnTest; 
    @FXML 
    private Label lblCategory; 
    @FXML 
    private Label lblIndex; 



    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     listview.setItems(listitems); 

    }  

    @FXML 
    private void handleSave(ActionEvent event) { 

     String category = lblCategory.getText(); 
     boolean duplicate = false; 
     //Add data. Check first if personData is empty 

       if (personData.isEmpty()){ 
        pp = new Persons(Integer.valueOf(lblIndex.getText()),category,txtName.getText(),txtLastName.getText()); 
        personData.add(pp); 
       }else{ 
        for(int i = 0 ; i<personData.size() ; i ++){ 
         if(Integer.toString(personData.get(i).getID()).equals(lblIndex.getText())){ 
          duplicate = true; 
         }else{ 
          duplicate = false; 

         } 
        } 
        System.out.println(duplicate); 
        if (duplicate == false){ 
         pp = new Persons(Integer.valueOf(lblIndex.getText()),category,txtName.getText(),txtLastName.getText()); 
         personData.add(pp); 
        }else{ 
         System.out.println("Duplicate"); 
        // Do Update later. 

        } 

       } 

     //Show data to Test 

      System.out.println("-- START OF LIST --"); 
     for (Persons person : personData){ 

      System.out.println(person.getID() + " " + person.getCategory()+ " " + person.getName() + " " + person.getLastname() + " "); 
     } 
     System.err.println(" "); 
    } 


    @FXML 
    private void handleListClick(MouseEvent event) { 
     lblCategory.setText(listview.getSelectionModel().getSelectedItem()); 
     lblIndex.setText(String.valueOf(listview.getSelectionModel().getSelectedIndex())); 
    } 
} 

如果我點擊它運作良好的listbox一個項目進行了多次..但如果比如我點擊的Visual Basic,然後ASP.net的回它仍然接受Visual Basic。 :( 需要諮詢和幫助。請

這是基於菲爾的建議代碼

@FXML 
private void handleSave(ActionEvent event) { 

    String category = lblCategory.getText(); 
    boolean duplicate = false; 
    int x = 0; 
    //Add data 

      Persons newPerson = new Persons(Integer.valueOf(lblIndex.getText()), category, txtName.getText(), txtLastName.getText()); 
      if (!personData.contains(newPerson)) { 
       personData.add(newPerson); 

      }else{ 
       System.out.println("Duplicate!"); 
      } 


    //Show data 

     System.out.println("-- START OF LIST --"); 
    for (Persons person : personData){ 

     System.out.println(person.getID() + " " + person.getCategory()+ " " + person.getName() + " " + person.getLastname() + " "); 
    } 

} 

,這裏是我的人類

public class Persons { 
private SimpleIntegerProperty id; 
private SimpleStringProperty name; 
private SimpleStringProperty lastname; 
private SimpleStringProperty category; 



public Persons(){} 
public Persons(int id, String category, String name, String lastname){ 
    this.id = new SimpleIntegerProperty(id); 
    this.name = new SimpleStringProperty(name); 
    this.lastname = new SimpleStringProperty(lastname); 
    this.category = new SimpleStringProperty(category); 


} 
public Persons(String name, String lastname){ 
    this.name = new SimpleStringProperty(name); 
    this.lastname = new SimpleStringProperty(lastname); 
} 

@Override 
public boolean equals(Object o){ 
    if (o == this) return true; 
    if (!(o instanceof Persons)){ 
     return false; 
    } 
    Persons persons = (Persons) o; 

    return persons.id.equals(id) && 
      persons.name.equals(name) && 
      persons.lastname.equals(lastname) && 
      persons.category.equals(category); 

} 


//SETTERS 
public void setID(int id) { 
    this.id = new SimpleIntegerProperty(id); 
} 
public void setName(String name) { 
    this.name = new SimpleStringProperty(name); 
} 
public void setLastname(String lastname) { 
    this.lastname = new SimpleStringProperty(lastname); 
} 
public void setCategory(String category) { 
    this.category = new SimpleStringProperty(category); 
} 

//GETTERS 

public int getID() { 
    return id.getValue(); 
} 

public String getName() { 
    return name.getValue(); 
} 

public String getLastname() { 
    return lastname.getValue(); 
} 
public String getCategory(){ 
    return category.getValue(); 
} 

// PROPERTIES 

public SimpleIntegerProperty idProperty(){ 
    return this.id; 
} 
public SimpleStringProperty nameProperty(){ 
    return this.name; 
} 
public SimpleStringProperty lastnameProperty(){ 
    return this.lastname; 
} 
public SimpleStringProperty categoryProperty(){ 
    return this.category; 
} 

}

+0

您好,我想我明白了。我用'休息';如果(Integer.toString(personData.get(i).getID())。equals(lblIndex.getText())成爲一個整數,則返回值爲int(int i = 0; i CuteGirlyGeek

回答

0

好吧,這看起來不錯。在您的平等執行中只需要一件小事:

@Override 
public boolean equals(Object o) { 
    if (o == this) return true; 
    if (!(o instanceof Persons)) { 
     return false; 
    } 
    Persons persons = (Persons) o; 

    // persons.id.equals() leads to the default implementation in Object 
    // --> instead use this one. 
    // The Property classes have their own isEqualTo method 
    // with get(), you will get your simple boolean from the returned BooleanBinding 
    return persons.id.isEqualTo(id).get() && 
     persons.name.isEqualTo(name).get() && 
     persons.lastname.isEqualTo(lastname).get() && 
     persons.category.isEqualTo(category).get(); 

} 

默認值等於來自Object的實現只是比較它是否是相同的實例。我們正在創建一個新的實例,並檢查包含(...)如果列表包含人員。

這裏是整個代碼我用來測試它:

public class Main extends Application { 

    private ObservableList<String> listitems = FXCollections.observableArrayList("Visual Basic", "ASP.net", "JavaFX"); 
    private ObservableList<Persons> personData = FXCollections.observableArrayList(); 

    private TextField txtName = new TextField(); 
    private TextField txtLastName = new TextField(); 
    private Button btnSave = new Button("save"); 
    private ListView<String> listview = new ListView<>(); 
    private Label lblCategory = new Label(); 
    private Label lblIndex = new Label(); 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 
     listview.setItems(listitems); 
     listview.setOnMouseClicked(this::handleListClick); 
     btnSave.setOnAction(this::handleSave); 

     VBox vb = new VBox(new HBox(5, new Label("Index:"), lblIndex), 
      new HBox(5, new Label("Category:"), lblCategory), 
      new HBox(5, new Label("Name:"), txtName), 
      new HBox(5, new Label("Last name:"), txtLastName) 
     ); 

     BorderPane bp = new BorderPane(); 
     bp.setLeft(listview); 
     bp.setCenter(vb); 
     bp.setRight(btnSave); 

     Scene scene = new Scene(bp, 600, 400); 
     stage.setScene(scene); 
     stage.show(); 
    } 


    private void handleSave(ActionEvent event) { 
     Persons newPerson = new Persons(Integer.valueOf(lblIndex.getText()), lblCategory.getText(), txtName.getText(), txtLastName.getText()); 
     if (!personData.contains(newPerson)) { 
      personData.add(newPerson); 
     } else { 
      System.out.println("Duplicate!"); 
     } 

     System.out.println("-- START OF LIST --"); 
     for (Persons person : personData) { 
      System.out.println(person); 
     } 

    } 

    private void handleListClick(MouseEvent event) { 
     System.out.println("click"); 
     lblCategory.setText(listview.getSelectionModel().getSelectedItem()); 
     lblIndex.setText(String.valueOf(listview.getSelectionModel().getSelectedIndex())); 
    } 


    public class Persons { 
     SimpleIntegerProperty id; 
     SimpleStringProperty name; 
     SimpleStringProperty lastname; 
     SimpleStringProperty category; 

     Persons(int id, String category, String name, String lastname) { 
      this.id = new SimpleIntegerProperty(id); 
      this.name = new SimpleStringProperty(name); 
      this.lastname = new SimpleStringProperty(lastname); 
      this.category = new SimpleStringProperty(category); 
     } 

     @Override 
     public boolean equals(Object o) { 
      if (o == this) return true; 
      if (!(o instanceof Persons)) { 
       return false; 
      } 
      Persons persons = (Persons) o; 

      // persons.id.equals() leads to the default implementation in Object 
      // --> instead use this one. 
      // The Property classes have their own isEqualTo method 
      // with get(), you will get your simple boolean from the returned BooleanBinding 
      return persons.id.isEqualTo(id).get() && 
       persons.name.isEqualTo(name).get() && 
       persons.lastname.isEqualTo(lastname).get() && 
       persons.category.isEqualTo(category).get(); 

     } 

     @Override 
     public String toString() { 
      return "Persons{" + 
       "id=" + id + 
       ", name=" + name + 
       ", lastname=" + lastname + 
       ", category=" + category + 
       '}'; 
     } 
    } 

} 
+0

謝謝菲爾先生,我不確定我有什麼建議。你能發表確切的例子,並把它放在哪裏?請。我試過但沒有得到我想要的。 ( – CuteGirlyGeek

+0

)我已經更新了我的答案,試着瞭解equals方法的概念是如何工作的 – Phil

+0

謝謝你,但是,它總是接受用戶輸入,即使重複也是如此我試過 人newPerson = new Persons(Integer.valueOf(lblIndex。 getText()),category,txtName.getText(),txtLastName.getText()); if(!personData.contains(newPerson)){ personData.add(newPerson); } else { System.out.println (「Duplicate!」); } – CuteGirlyGeek