2016-04-08 12 views
0

私のプロジェクトでJavaFX、Hibernate、Springを使用しています。JavaFXコンボボックスがオブジェクトから正しい値を表示していません

そして、私はオブジェクト値でコンボボックスを塗りつぶす必要があります。 私のコンボボックスでは、私のモデルからタイトル値だけを表示する必要があります。

私のモデルクラス:私は読ん (約電池工場:コンボボックスは、このデータをいくつかの他の操作をするためにするためのいくつかのメソッドリスナーがある

public class Sector extends Identifier { 
    private String title; 

    private List<Stage> stageList; 

    public List<Stage> getStageList() { 
     return stageList; 
    } 

    public void setStageList(List<Stage> stageList) { 
     this.stageList = stageList; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    @Override 
    public String toString() { 
     return "Sector{" + 
       "id='" + getId() + '\'' + 
       "title='" + title + '\'' + 
       ", stageList=" + stageList + 
       '}'; 
    } 
} 

と私のコントローラで

public class Stage extends Identifier { 
    private String name; 

    private Station firstStation; 

    private Station secondStation; 

    private List<CommunicationDistance> communicationDistanceList; 

    public Stage() { 
    } 

    public Stage(String name, Station firstStation, Station secondStation) { 
     this.name = name; 
     this.firstStation = firstStation; 
     this.secondStation = secondStation; 
    } 

    public List<CommunicationDistance> getCommunicationDistanceList() { 
     return communicationDistanceList; 
    } 

    public void setCommunicationDistanceList(List<CommunicationDistance> communicationDistanceList) { 
     this.communicationDistanceList = communicationDistanceList; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Station getFirstStation() { 
     return firstStation; 
    } 

    public void setFirstStation(Station firstStation) { 
     this.firstStation = firstStation; 
    } 

    public Station getSecondStation() { 
     return secondStation; 
    } 

    public void setSecondStation(Station secondStation) { 
     this.secondStation = secondStation; 
    } 

    @Override 
    public String toString() { 
     return "Stage{" + 
       "id='" + getId() + '\'' + 
       "name='" + name + '\'' + 
       ", firstStation=" + firstStation + 
       ", secondStation=" + secondStation + 
       ", communicationDistanceList=" + communicationDistanceList + 
       '}'; 
    } 

this questionからfrom here

@FXML 
     public void currentSectorSelected(ActionEvent actionEvent) { 
      ObservableList<Stage> observableList = FXCollections.observableArrayList(((Sector) sector.getSelectionModel().getSelectedItem()).getStageList()); 
      stage.setItems(observableList); 
      stage.getSelectionModel().selectFirst(); 

      stage.setCellFactory(new Callback<ListView<Stage>, ListCell<Stage>>() { 
       @Override 
       public ListCell<Stage> call(ListView<Stage> param) { 

        return new ListCell<Stage>(){ 
         @Override 
         public void updateItem(Stage item, boolean empty){ 
          super.updateItem(item, empty); 
          if(!empty) { 
           setText(item.getName()); 
           setGraphic(null); 
          } else { 
           setText(null); 
          } 
         } 
        }; 
       } 
      }); 
     } 

すべてが働いているが、私のコンボボックス内の値は、これらのように示す: enter image description here

これは、私の正しいオブジェクトですが、それでも私は私のセクターおよびその他のオブジェクトからのみタイトルフィールドを表示するために私のコンボボックスをフォーマットする方法を理解することはできません? コンボボックス出力をフォーマットするためのいくつかの有効な/正しい例を表示できますか?

編集1: 私のinitメソッドでは、私は単にコンボボックスに自分のオブジェクトのリストを追加しています。私はこれが正しい方法であることを確認していないが、私はコンボボックスの値を選択した後、このデータを検証したい場合は - 私は、コンボボックスに完全なオブジェクトを設定するには次の条件を満たす必要があります。

​​
+1

デバッグしましたか? setText(item.getName()); ここでは文字列が返され、コンボボックスは単純にその文字列を表示します。つまり、問題はコンボボックスにはありませんが、 "getName()"は間違った値を返します。 – DVarga

+0

こんにちはDVarga。私の新しい編集を見てください。 –

+1

あなたは正しいです。コンボボックスではなく、保存されたデータに問題がありました。 ItachiUchihaの変形とあなたのアドバイス - 私はこの問題を解決しました。ありがとう! –

答えて

4

あなたが代わりにオーバーライドのStringConverterを使用する必要がありますListCell。これは、同じ結果を達成するよりエレガントな方法です。

StringConverter<Sector> converter = new StringConverter<Sector>() { 
    @Override 
    public String toString(Sector object) { 
     return object.getTitle(); 
    } 

    @Override 
    public Sector fromString(String string) { 
     return null; 
    } 
}; 

MCVE

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.util.StringConverter; 

public class ComboBoxConverter extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception { 

     ComboBox<Sector> comboBox = new ComboBox<>(); 
     StringConverter<Sector> converter = new StringConverter<Sector>() { 
      @Override 
      public String toString(Sector object) { 
       return object.getTitle(); 
      } 

      @Override 
      public Sector fromString(String string) { 
       return null; 
      } 
     }; 
     comboBox.setConverter(converter); 

     comboBox.setItems(FXCollections.observableArrayList(new Sector("Title1", 24), new Sector("Title2", 50))); 
     comboBox.getSelectionModel().selectFirst(); 
     VBox box = new VBox(comboBox); 
     box.setAlignment(Pos.CENTER); 
     Scene scene = new Scene(box, 200, 200); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
} 

部門のクラスは、2つのフィールドを持つ単純なPOJOです。

public class Sector { 
    private String title; 
    private double area; 

    public Sector(String title, double area) { 
     this.title = title; 
     this.area = area; 
    } 

    public double getArea() { 
     return area; 
    } 

    public void setArea(double area) { 
     this.area = area; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 
} 
+0

ありがとうございました:)それは助けました。私はまた、私のエンティティとあなたのソリューションでいくつかの問題を発見 - それは正常に動作します。 –

関連する問題