2016-11-09 3 views
2

У меня есть checkfx CheckListView (даже такая же проблема с элементом управления ListView javafx), где я хочу отображать RadioButtons вместо CheckBox. Таким образом, я реализовал пользовательскую фабрику ячеек, обратившись за помощью из нескольких учебных пособий javafx, и он работает. Проблема в том, что я выбрал первый переключатель и немного прокрутился вниз, чтобы некоторые из моих верхних переключателей были прокручены и теперь не видны. Затем снова я прокрутил вверх, теперь выбор уже ушел.javafx ListView с пользовательской фабрикой ячеек, не сохраняющей выбранную ячейку

Я отлаживаю код, понимая, что новые ячейки создаются каждый раз, и это приводит к этой проблеме, но, к сожалению, не может найти решение.

У меня есть пример кода, который я получил из переполнения стека, который имеет ту же проблему.

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

Пожалуйста нужно ур помочь в этом. (Я использую JavaFX 8)

ответ

4

Вы должны создать кнопку одного радио для ячейки (вместо того, чтобы создавать новую каждый раз updateItem(...) называется, и обновить выбранное состояние в методе updateItem(...) с использованием соответствующей логики от вашего представления данных

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

. Например:

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

Вы спасли мой день. Большое спасибо. На самом деле я попробовал то же самое, но как-то потерял в середине. Я хочу довести это до вашего сведения. Ваше решение работает, но если я выбираю первый переключатель, он выбирается, а также загорается 11-й переключатель (если отображаются 10 кнопок). (не выбран, но становится фокусом). На данный момент это не проблема. Еще раз спасибо. –

+0

http://imgur.com/EnfGCcP –

+1

@SaravanaKumar Я могу понять, почему это произойдет, но я не могу воспроизвести его надежно. Выбор/фокусировка в ячейках - это непростая задача. –