2016-11-09 2 views
2

Ich habe eine controlsfx CheckListView (sogar das gleiche Problem mit javafx ListView-Steuerelement), wo ich RadioButtons anstelle von CheckBox anzeigen möchten. Also habe ich die benutzerdefinierte Zellen-Factory implementiert, indem ich Hilfe von wenigen Javafx-Tutorials genommen habe, und es funktioniert. Das Problem ist, dass ich die erste Radio-Taste ausgewählt habe und ein wenig nach unten scrollen, so dass einige meiner oberen Radio-Taste nach oben gescrollt werden und jetzt nicht sichtbar sind. Dann bin ich wieder hochgescrollt, die Auswahl ist jetzt weg.javafx ListView mit benutzerdefinierten Zelle Fabrik nicht die ausgewählte Zelle

Ich debugge den Code verstehen, dass neue Zellen jedes Mal erstellt werden, und das führt zu diesem Problem, aber leider kann die Lösung nicht herausfinden.

Ich füge einen Beispielcode an, den ich vom Stapelüberlauf bekommen habe, der das gleiche Problem hat.

package application; 
import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.ListView; 
import javafx.scene.control.RadioButton; 
import javafx.scene.control.ToggleGroup; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class RadioButtonListView extends Application { 

    public static final ObservableList names = FXCollections.observableArrayList(); 
    private ToggleGroup group = new ToggleGroup(); 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("List View Sample"); 

     final ListView listView = new ListView(); 
     listView.setPrefSize(200, 250); 
     listView.setEditable(true); 

     names.addAll("Adam", "Alex", "Alfred", "Albert", "Brenda", "Connie", "Derek", "Donny", "Lynne", "Myrtle", "Rose", "Rudolph", "Tony", "Trudy", "Williams", "Zach"); 

     listView.setItems(names); 
     listView.setCellFactory(param -> new RadioListCell()); 
     StackPane root = new StackPane(); 
     root.getChildren().add(listView); 
     primaryStage.setScene(new Scene(root, 200, 250)); 
     primaryStage.show(); 
    } 

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

    private class RadioListCell extends ListCell<String> { 
     @Override 
     public void updateItem(String obj, boolean empty) { 
      super.updateItem(obj, empty); 
      if (empty) { 
       setText(null); 
       setGraphic(null); 
      } else { 
       RadioButton radioButton = new RadioButton(obj); 
       radioButton.setToggleGroup(group); 
       // Add Listeners if any 
       setGraphic(radioButton); 
      } 
     } 
    } 
} 

Bitte braucht Hilfe ur in diesem. (Ich verwende javafx 8)

Antwort

4

Sie sollten eine einzelne Radiobutton für die Zelle erstellen (anstatt einen neuen zu erstellen jedes Mal updateItem(...) genannt wird, und seinen ausgewählten Zustand in der updateItem(...) Methode aktualisiert entsprechende Logik aus Ihrer Datendarstellung mit

private class RadioListCell extends ListCell<String> { 

    private final RadioButton radioButton = new RadioButton(); 

    RadioListCell() { 
     radioButton.setToggleGroup(group); 
     // Add listeners here... 
    } 

    @Override 
    public void updateItem(String obj, boolean empty) { 
     super.updateItem(obj, empty); 
     if (empty) { 
      setText(null); 
      setGraphic(null); 
     } else { 
      radioButton.setText(obj); 

      radioButton.setSelected(...); 

      setGraphic(radioButton); 
     } 
    } 
} 

. Zum Beispiel:

import java.util.Objects; 

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.ListView; 
import javafx.scene.control.RadioButton; 
import javafx.scene.control.ToggleGroup; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class RadioButtonListView extends Application { 

    public static final ObservableList<String> names = FXCollections.observableArrayList(); 
    private ToggleGroup group = new ToggleGroup(); 

    private String selectedName ; 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("List View Sample"); 

     final ListView<String> listView = new ListView<>(); 
     listView.setPrefSize(200, 250); 
     listView.setEditable(true); 

     names.addAll("Adam", "Alex", "Alfred", "Albert", "Brenda", "Connie", "Derek", "Donny", "Lynne", "Myrtle", "Rose", "Rudolph", "Tony", "Trudy", "Williams", "Zach"); 

     listView.setItems(names); 
     listView.setCellFactory(param -> new RadioListCell()); 
     StackPane root = new StackPane(); 
     root.getChildren().add(listView); 
     primaryStage.setScene(new Scene(root, 200, 250)); 
     primaryStage.show(); 
    } 

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

    private class RadioListCell extends ListCell<String> { 

     private final RadioButton radioButton = new RadioButton(); 

     RadioListCell() { 
      radioButton.setToggleGroup(group); 
      radioButton.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> { 
       if (isNowSelected) { 
        selectedName = getItem(); 
       } 
      }); 
     } 

     @Override 
     public void updateItem(String obj, boolean empty) { 
      super.updateItem(obj, empty); 
      if (empty) { 
       setText(null); 
       setGraphic(null); 
      } else { 
       radioButton.setText(obj); 

       radioButton.setSelected(Objects.equals(obj, selectedName)); 

       setGraphic(radioButton); 
      } 
     } 
    } 
} 
+0

Sie haben meinen Tag gerettet. Danke vielmals. Eigentlich habe ich das gleiche versucht aber irgendwie in der Mitte verloren. Ich möchte dies zu Ihrem Wissen bringen. Ihre Lösung funktioniert, aber wenn ich das erste Optionsfeld anwähle, wird es ausgewählt, aber auch die Runde des 11. Optionsfelds (wenn 10 Schaltflächen sichtbar sind) wird hervorgehoben. (nicht ausgewählt, sondern den Fokus erhalten). Im Moment kein Problem. Danke noch einmal. –

+0

http://imgur.com/EnfGCcP –

+1

@SaravanaKumar Ich kann sehen, warum das passieren würde, aber ich kann es nicht zuverlässig reproduzieren. Auswahl/Fokus in Zellen ist etwas schwierig. –

Verwandte Themen