2014-02-24 5 views
0

JavaFX를 사용하는 응용 프로그램이 있습니다. 여기에는 ObservableList를 사용하는 ListView가 있습니다.JavaFX ObservableList가 자동 선택을 방지합니다.

list.getSelectionModel().selectedItemProperty().addListener(new ChangeListener... 

을 사용하여 ChangeListener를 추가했으며 정상적으로 작동합니다. oher 항목을 선택할 때마다 리스너가 호출됩니다.

그러나 ObservableList에서 요소를 제거 할 때도 호출됩니다. 요소가 제거 된 후 목록의 다른 요소가 자동으로 선택되고 수신기가 호출됩니다.

이 동작을 어떻게 막을 수 있습니까?

감사합니다.

final ObservableList<String> fruits = FXCollections.observableArrayList("Apple", "Banana", "Pear", "Strawberry", "Peach", "Orange", "Plum", "Melon", "Cherry", "Blackberry", "Melon", "Cherry", "Blackberry"); 
final ComboBox fruit = new ComboBox(fruits); 

fruit.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() { 
    public void changed(ObservableValue<? extends String> ov, String old_val, String new_val) { 
     //TODO: your remove method 
    } 
}); 
+0

리스너를 제거하고 항목을 삭제 한 다음 리스너를 다시 추가해야합니다. 이 작업은 코드에 따라 다르지만 항목이 삭제 된 곳이나 getRemoved()를 사용하여 목록 변경 리스너에서 변경 될 수 있습니다. – brian

답변

0

이보십시오.

선택 변경에 대한 수신기를 사용하는 대신 목록에서 마우스 클릭 이벤트 만 처리합니다. 클릭 이벤트를 받으면 ListView에서 선택한 요소를 요청합니다. 요소를 제거하거나 추가 할 때 호출되지 않습니다. 목록을 클릭하면됩니다.

+0

실제로 좋은 생각이지만 ListView를 사용하고 싶습니다. –

+0

'ListView' 대신'ComboBox'에 사용할 수있는 모든 구성 요소를 'final lv = new ...'로 표시합니다. –

0

내가 작품 해결책을 찾았지만, 그것은 좋은 해결책이 아니다 :

1

내 의견이 너무 이상한 경우에;

package listchange; 

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.collections.FXCollections; 
import javafx.collections.ListChangeListener; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ListView; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class ListChange extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     ObservableList<String> data = FXCollections.observableArrayList(); 
     data.addAll("one","two","three","four"); 

     ChangeListener changeListener = new ChangeListener() { 
      @Override 
      public void changed(ObservableValue observable, Object oldValue, Object newValue) { 
       System.out.println("new val "+newValue); 
      } 
     }; 

     ListView lv = new ListView(data); 
     lv.getSelectionModel().selectedItemProperty().addListener(changeListener); 

     data.addListener(new ListChangeListener<String>() { 
      @Override 
      public void onChanged(ListChangeListener.Change<? extends String> c) { 
       c.next(); 
       if (c.wasRemoved()){ 
        lv.getSelectionModel().selectedItemProperty().removeListener(changeListener); 
       } 
      } 
     }); 

     Button b = new Button("delete"); 
     b.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent event) { 
       //you can remove listener here or in data ListChangeListener 
       //lv.getSelectionModel().selectedItemProperty().removeListener(changeListener); 
       if (data.size() > 0) data.remove(0); 
       //you have to re-add the listener after removing 
       lv.getSelectionModel().selectedItemProperty().addListener(changeListener); 
      } 
     }); 

     VBox root = new VBox(); 
     root.getChildren().addAll(lv,b); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

} 

이렇게하면 키를 사용하여 탐색 할 때 변경된 이벤트가 계속 표시됩니다. 삭제가 어디에서 발생하는지 알면 리스너를 제거한 다음 다시 추가하는 것이 쉽습니다.

+0

감사합니다. 나를 위해 잘 작동하는 다른 솔루션을 찾았습니다. 목록에서 요소를 제거하기 바로 전에 플래그를 설정합니다. 선택 처리기 메서드에서이 플래그를 확인하고 true 인 경우 이벤트를 무시하고 플래그를 다시 플 래시로 설정합니다. –

관련 문제