2016-11-09 2 views
2

CheckBoxではなくRadioButtonを表示するcontrolsfx CheckListView(javafx ListViewコントロールでも同じ問題)があります。だから私はいくつかの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なぜそれが起こるのか分かりますが、確実に再現することはできません。細胞の選択/フォーカスは、ややこしいことです。 –

関連する問題