Mam taką tabelę w ms sql
:
Mam klasę guide
:
public class guide {
private String kanal;
private String program;
private LocalTime godzina;
(...)
Oraz klasę gui
:
public class gui extends Application {
Stage stage;
Scene sceneGlowna;
int liczbaKanalow;
List<String> glownaKanaly;
@Override
public void start(Stage primaryStage) throws Exception {
TableView<guide> tableGlowna = new TableView<>(wczytajGlowna());
List<TableColumn<guide, String>> colKanalList = new ArrayList<>();
for (int i = 0; i < liczbaKanalow; i++) {
colKanalList.add(new TableColumn<guide, String>(glownaKanaly.get(i)));
}
for(int i = 0; i < colKanalList.size(); i++){
colKanalList.get(i).setCellValueFactory(new PropertyValueFactory<guide, String>("program"));
}
for(int i = 0; i < colKanalList.size(); i++)
tableGlowna.getColumns().add(colKanalList.get(i));
BorderPane paneglowna = new BorderPane(tableGlowna);
sceneGlowna = new Scene(paneglowna);
stage = primaryStage;
stage.setScene(sceneGlowna);
stage.setTitle("ProgramTV");
stage.show();
}
public ObservableList<guide> wczytajGlowna(){
ObservableList<guide> glownaList = FXCollections.observableArrayList();
int iloscKanalow = 0;
try {
ObslugaDB dbGlowna = new ObslugaDB();
Connection myConnection = dbGlowna.polacz_z_baza();
String query = "SELECT * FROM glowna";
ResultSet glowaFromDB = dbGlowna.getFromSQL(myConnection, query);
String tempKanal = "";
glownaKanaly = new ArrayList<>();
while (glowaFromDB.next()) {
if(glowaFromDB.getString(3).toString() != null && !glowaFromDB.getString(3).toString().isEmpty()) {
if(!glowaFromDB.getString(2).equals(tempKanal)){
iloscKanalow++;
tempKanal = glowaFromDB.getString(2);
glownaKanaly.add(tempKanal);
}
glownaList.add(new guide(glowaFromDB.getString(2), glowaFromDB.getString(3), new LocalTime(glowaFromDB.getString(4))));
}
}
} catch(Exception ex){
ex.printStackTrace();
}
liczbaKanalow = iloscKanalow;
return glownaList;
}
}
Z racji, iż pobieram każdy program
z całej listy zwróconej przez metodę wczytajGlowna()
dla każdej kolumny, tutaj:
for(int i = 0; i < colKanalList.size(); i++){
colKanalList.get(i).setCellValueFactory(new PropertyValueFactory<guide, String>("program"));
}
Logicznym efektem działania jest taki wynik:
Jednak chciałbym wyświetlać w odpowiedniej kolumnie filmy tylko dla odpowiedniego kanału, to znaczy dla kolumny TV 4
mieć tylko filmy CSI:Kry(...)
,Grudge(...)
oraz Kochaj(...)
, odpowiednio dla każdego innego kanału/kolumny. Próbowałem napisać swój callback
mniej więcej, tak:
colKanalList.get(i).setCellValueFactory(new Callback<TableColumn.CellDataFeatures<guide, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<guide, String> p) {
if (p.getValue().getKanal().equals(/*colKanalList.get(i)*/)) {
return new SimpleStringProperty(p.getValue();
} else {
return new SimpleStringProperty("<no name>");
}
}
});
Tyle, że wykomentowany kawałek jest niedozwolony (i
musiało by być stałe). Próbowałem nawet inaczej, aby każdą kolumnę generować osobno, kolejno jedna po drugiej, ale to też okazało się źle, bo cały czas kręcę się wokół jednej ObservableList<guide>
. Musi być jakiś sposób zdefiniowania własnego callback
a, ale cały czas mi nie wychodzi, stąd mój post, może tutaj ktoś byłby w stanie mi pomóc, będę bardzo wdzięczny za każdą wskazówkę.
karolinaa