Java FX List<AlbumsBean> in FXML TableView

Harry05

Bekanntes Mitglied
Hi Leute,

ich bekomme Informationen aus einer Datenbank mit dieser Methode
Java:
 public List<AlbumsBean> loadAlbumsByUserId(int id) {
        return getSessionFactory().openSession()
                .createQuery("FROM AlbumsBean WHERE profil_id = :id", AlbumsBean.class)
                .setParameter("id", id)
                .list();
    }

So sieht mein Bean aus.
Java:
@Entity
@Table(name = "album_t")
public class AlbumsBean {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;
    @Column(name = "name", nullable = true, length = 45)
    private String name;
    @Column(name = "bandName", nullable = true, length = 45)
    private String bandName;
    @Column(name = "erscheinungJahr", nullable = true, length = 45)
    private String erscheinungsJahr;
    @ManyToOne(cascade = CascadeType.ALL)
    private ProfilBean profil;

    public AlbumsBean(String name, String bandName, String erscheinungsJahr, ProfilBean profil) {
        this.name = name;
        this.bandName = bandName;
        this.erscheinungsJahr = erscheinungsJahr;
        this.profil = profil;
    }

    public AlbumsBean() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getBandName() {
        return bandName;
    }

    public void setBandName(String bandName) {
        this.bandName = bandName;
    }

    public String getErscheinungsJahr() {
        return erscheinungsJahr;
    }

    public void setErscheinungsJahr(String erscheinungsJahr) {
        this.erscheinungsJahr = erscheinungsJahr;
    }

    public ProfilBean getProfil() {
        return profil;
    }

    public void setProfil(ProfilBean profil) {
        this.profil = profil;
    }
}
ich wollte es gerne in diese FXML Tabelle einfügen

Java:
 <TableView fx:id="albumTable" fixedCellSize="0.0" layoutY="100.0" prefHeight="200.0" prefWidth="381.0">
        <columns>
          <TableColumn fx:id="name" prefWidth="85.0" text="Album Name" />
          <TableColumn fx:id="bandName" prefWidth="141.0" text="Band Name" />
            <TableColumn fx:id="Jahr" prefWidth="153.0" resizable="false" text="Erscheinungs Jahr" />
        </columns>
      </TableView>
mein Controller sieht so aus
Java:
@FXML
private TableView <AlbumsBean> albumTable;
@FXML
private TableColumn<AlbumsBean, String> name;
@FXML
private TableColumn<AlbumsBean, String> bandName;
@FXML
private TableColumn<AlbumsBean, String> Jahr;

private ObservableList<AlbumsBean> data;

AlbumsDaoImp albumDao = new AlbumsDaoImp();

List<AlbumsBean> albumsBeans = albumDao.loadAlbumsByUserId(StaticContext.userId);

//hier weiß ich nicht mehr weiter



ich hatte mir mal so was gedacht um das Bean anzupassen es funktioniert nicht
Java:
@Entity
@Table(name = "album_t")
public class AlbumsBean {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private final IntegerProperty id;
    @Column(name = "name", nullable = true, length = 45)
    private final StringProperty name;
    @Column(name = "bandName", nullable = true, length = 45)
    private final StringProperty bandName;
    @Column(name = "erscheinungJahr", nullable = true, length = 45)
    private final StringProperty erscheinungsJahr;
    @ManyToOne(cascade = CascadeType.ALL)
    private ProfilBean profil;

    public AlbumsBean(IntegerProperty id, StringProperty name, StringProperty bandName, StringProperty erscheinungsJahr, ProfilBean profil) {
        this.id = id;
        this.name = name;
        this.bandName = bandName;
        this.erscheinungsJahr = erscheinungsJahr;
        this.profil = profil;
    }

    public int getId() {
        return id.get();
    }

    public IntegerProperty idProperty() {
        return id;
    }

    public void setId(int id) {
        this.id.set(id);
    }

    public String getName() {
        return name.get();
    }

    public StringProperty nameProperty() {
        return name;
    }

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

    public String getBandName() {
        return bandName.get();
    }

    public StringProperty bandNameProperty() {
        return bandName;
    }

    public void setBandName(String bandName) {
        this.bandName.set(bandName);
    }

    public String getErscheinungsJahr() {
        return erscheinungsJahr.get();
    }

    public StringProperty erscheinungsJahrProperty() {
        return erscheinungsJahr;
    }

    public void setErscheinungsJahr(String erscheinungsJahr) {
        this.erscheinungsJahr.set(erscheinungsJahr);
    }

    public ProfilBean getProfil() {
        return profil;
    }

    public void setProfil(ProfilBean profil) {
        this.profil = profil;
    }
}

für Hilfe und konstruktive Kritik danke ich im voraus
 
Hallo Harry05,

ich habe bisher bei mir immer so gemacht,

Code:
@Entity
@Table(name = "album_t")
public class AlbumsBean {

     @Id
     @GeneratedValue
     @Column(name = "id")
     private int id;
     @Column(name = "name", nullable = true, length = 45)
     private String name;
     @Column(name = "bandName", nullable = true, length = 45)
     private String bandName;
     @Column(name = "erscheinungJahr", nullable = true, length = 45)
     private String erscheinungsJahr;
     @ManyToOne(cascade = CascadeType.ALL)
     private ProfilBean profil;

    @Transient private IntegerProperty idProperty = new SimpleIntegerProperty();
    @Transient private StringProperty nameProperty = new SimpleStringProperty();
    @Transient private StringProperty bandNameProperty = new SimpleStringProperty();
    @Transient private StringProperty erscheinungsJahrProperty = new SimpleStringProperty();
}

Im Konstruktor dann noch extra die Properties mit den felder initialisiert.

Ich hatte früher sogar direkt die Spalten mit den Felder gesetzt anstatt über die Property zu gehen.

Grüße
lam
 
Du kannst den Columns eine CellValueFactory setzen, anbieten würde sich da eine PropertyValueFactory.

Das Model „verschmutzen“ mit Properties würde ich nicht.
 
Die Frage ist: Will man wirklich die Domänen-Objekte im UI anzeigen?

Ich hab auch schon mal die Variante von @lam_tr - am meisten dagegen spricht IMHO nur der immense Aufwand.

Aber sonst würde ich wohl auch der Einfachheit halber eine passendere ValueFactory verwenden, oder aber die TableColumn<AlbumsBean, String> auf TableColumn<AlbumsBean, AlbumsBean> ändern und eine dedizierte CellFactory verwenden. Viele Wege führ'n nach Rom... 😉
 
@dzim
Die Frage ist: Will man wirklich die Domänen-Objekte im UI anzeigen?
das verstehe ich nicht besonders die Domänen-Objekte

Aber sonst würde ich wohl auch der Einfachheit halber eine passendere ValueFactory verwenden, oder aber die TableColumn<AlbumsBean, String> auf TableColumn<AlbumsBean, AlbumsBean> ändern

ich habe mir gedacht, dass ich das über ne foreach lupe und das dann anklicken kann in der View. So das ich per id Tracks aufrufen kann in einer anderen Tabelle, mit dem gleichen Spiel ohne was neues aufzurufen.
Java:
List<AlbumsBean> albumsBeans = albumDao.loadAlbumsByUserId(StaticContext.userId);

dedizierte CellFactory verwenden
Was ist das denn ??
 
@mrBrown ,@dzim
Bin ich nah dran oder schieße ich neben das Ziel ??
Java:
List<AlbumsBean> albumsBeans = albumDao.loadAlbumsByUserId(StaticContext.userId);
        for (AlbumsBean show: albumsBeans) {
            name.setCellFactory(new PropertyValueFactory<AlbumsBean,AlbumsBean> (show.getName()));
        }
 
Daneben geschossen 😉
Java:
name.setCellFactory(new PropertyValueFactory<AlbumsBean,AlbumsBean> („name“);
Müsste passen
 
@mrBrown ,@dzim
was soll ich jetzt machen ??

ist das vielleicht eine Idee
Java:
  public ObservableList<Object> loadAlbumsByUserId1(int id){
        return FXCollections.observableArrayList(
                getSessionFactory().openSession()
                        .createQuery("FROM AlbumsBean WHERE profil_id = :id", AlbumsBean.class)
                        .setParameter("id", id)
                        .list());



    }

oder so was in der Art ??
 
@mrBrown

ne funkt nicht und es fehlt eine runde Klammer am ende

jetzt ist soooooo
Java:
for (AlbumsBean show: albumsBeans) {
            name.setCellFactory(new PropertyValueFactory<AlbumsBean,AlbumsBean> (show.getName()));
        }
Das funktioniert auf jeden Fall auch nicht. Guck dir doch einfach mal das JavaDoc dazu an, da steht ein Beispiel.
 
@mrBrown
Brauche ich jetzt so was ??
Java:
 TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");
firstNameCol.setCellValueFactory(new Callback<CellDataFeatures<Person, String>, ObservableValue<String>>() {
     public ObservableValue<String> call(CellDataFeatures<Person, String> p) {
         // p.getValue() returns the Person instance for a particular TableView row
         return p.getValue().firstNameProperty();
     }
  });
ich habe es so umgeschrieben ich kann kein Property in mein DAO machen.
Java:
 name.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<AlbumsBean, String>, ObservableValue<String>>() {
            public ObservableValue<String> call(TableColumn.CellDataFeatures<AlbumsBean, String> p) {
                // p.getValue() returns the Person instance for a particular TableView row
                return p.getValue().nameProperty();
            }
        });
 
Die ersten Zeilen aus dem JavaDoc wären passend gewesen (in etwa das, was ich auch geschrieben hab, was ging denn da bei dir nicht?)
 
@mrBrown

ich habe mich dafür entschieden doch keine anzeige in Tabelle.
Java:
List<AlbumsBean> albumsBeans = albumDao.loadAlbumsByUserId(StaticContext.userId);
for (AlbumsBean show: albumsBeans) {
            name.setCellValueFactory(new PropertyValueFactory<AlbumsBean,AlbumsBean>( show.getName() ));
        }

Java:
   @FXML
    private TableView<AlbumsBean> albumTable;
    @FXML
    private TableColumn<AlbumsBean, AlbumsBean> name;
    @FXML
    private TableColumn<AlbumsBean, AlbumsBean> bandName;
    @FXML
    private TableColumn<AlbumsBean, AlbumsBean> Jahr;

    private ObservableList<AlbumsBean> data = FXCollections.observableArrayList();
 
Du schreibst, du hast dich gegen die Tabelle entschieden (oder meint der Satz was völlig anderes?), postest aber Code für Tabellen^^
 
@mrBrown
ich meine das das Ergebnis ist was ich mir als letztes gedacht habe
Java:
List<AlbumsBean> albumsBeans = albumDao.loadAlbumsByUserId(StaticContext.userId);
for (AlbumsBean show: albumsBeans) {
            name.setCellValueFactory(new PropertyValueFactory<AlbumsBean,AlbumsBean>( show.getName() ));
        }

ab die Tabelle in der GUI zeigt immer noch (kein content vorhanden)



also läuft nicht fuuuuuuuuuck
 
Wie schon mal geschrieben:
Java:
name.setCellValueFactory(new PropertyValueFactory<AlbumsBean,String>( „name“ ))
Typ der Column entsprechend anpassen.
Ohne Schleife oder sonstiges drumherum.
 
@mrBrown
Typ der Column entsprechend anpassen.
Ohne Schleife oder sonstiges drumherum.
wie soll ich den den Inhalt aus
Java:
List<AlbumsBean> albumsBeans = albumDao.loadAlbumsByUserId(StaticContext.userId);

in das hier machen??
Java:
name.setCellValueFactory(new PropertyValueFactory<AlbumsBean,String>( "lol" ));

ohne Schleife für das
Java:
List<AlbumsBean> albumsBeans = albumDao.loadAlbumsByUserId(StaticContext.userId);

und das hier funkt nicht steht in der tabelle (kein content) für das hier

Java:
name.setCellValueFactory(new PropertyValueFactory<AlbumsBean,String>( "lol" ));
 
@mrBrown so ich hab's hinbekommen obwohl ich glaube das es Etwas doppelt gemoppelt ist aber es läuft.
1. eine ganz neue Klasse erstellt
Java:
public class Alben {

    private final IntegerProperty id;
    private final StringProperty albumName;
    private final StringProperty bandName;
    private final StringProperty jahr;

    public Alben(int id, String albumName, String bandName, String jahr) {
        this.id = new SimpleIntegerProperty(id);
        this.albumName = new SimpleStringProperty(albumName);
        this.bandName = new SimpleStringProperty(bandName);
        this.jahr = new SimpleStringProperty(jahr);
    }



    public int getId() {
        return id.get();
    }

    public IntegerProperty idProperty() {
        return id;
    }

    public void setId(int id) {
        this.id.set(id);
    }

    public String getAlbumName() {
        return albumName.get();
    }

    public StringProperty albumNameProperty() {
        return albumName;
    }

    public void setAlbumName(String albumName) {
        this.albumName.set(albumName);
    }

    public String getBandName() {
        return bandName.get();
    }

    public StringProperty bandNameProperty() {
        return bandName;
    }

    public void setBandName(String bandName) {
        this.bandName.set(bandName);
    }

    public String getJahr() {
        return jahr.get();
    }

    public StringProperty jahrProperty() {
        return jahr;
    }

    public void setJahr(String jahr) {
        this.jahr.set(jahr);
    }
}
2. im Controller das gemacht
Java:
@FXML
    private TableView<Alben> albumTable;
    @FXML
    private TableColumn<Alben, String> name;
    @FXML
    private TableColumn<Alben, String> bandName;
    @FXML
    private TableColumn<Alben, String> jahr;

    private ObservableList<Alben> alben = FXCollections.observableArrayList();

public void postInit() {
        
         AlbumsDaoImp albumDao = new AlbumsDaoImp();
       
        List<AlbumsBean> albumsBeans = albumDao.loadAlbumsByUserId(StaticContext.userId);
        for (AlbumsBean show: albumsBeans) {

            alben.add(new Alben(show.getId(),show.getName(),show.getBandName(),show.getErscheinungsJahr()));

            name.setCellValueFactory(cellData -> cellData.getValue().albumNameProperty());
            bandName.setCellValueFactory(cellData -> cellData.getValue().bandNameProperty());
            jahr.setCellValueFactory(cellData -> cellData.getValue().jahrProperty());

        }
        albumTable.setItems(alben);
    }

warum doppelt weil meine AlbumsBean fast genauso aussieht vielleicht muss das so wer weiß ???!!!
 
Das, was man bei der PropertyFactory angibt, ist der Name das anzuzeigenden Feldes.
Hat deine AlbumBean ein Feld namens „lol“ oder eher nicht?
 
Hallo Harry05,

Code:
for (AlbumsBean show: albumsBeans) {

             alben.add(new Alben(show.getId(),show.getName(),show.getBandName(),show.getErscheinungsJahr()));

             name.setCellValueFactory(cellData -> cellData.getValue().albumNameProperty());
             bandName.setCellValueFactory(cellData -> cellData.getValue().bandNameProperty());
             jahr.setCellValueFactory(cellData -> cellData.getValue().jahrProperty());

         }

Die CellValueFactory Initialisierung muss nur einmal gemacht werden. Und wenn du JavafX-"Property"s benutzt würde ich die PropertyValueFactory wie hier Example 12-5 http://docs.oracle.com/javafx/2/ui_controls/table-view.htm, ansonsten eine eigene TableCell mit dem beliebigen Wert zurückgeben lassen.

Grüße
lam
 
Du hast es zwar jetzt hinbekommen, aber ich hab nun auch etwas Zeit gefunden, dir mal wieder zu antworten.

Nur mal der Vollständigkeit halber ein komplexeres Beispiel, dass viele der problematischen Aspekte aus diesem Thread anspricht.
In meinem Repo hab ich mal für eine Frage hier im Forum folgendes UI erstellt:
https://github.com/bgmf/poc/blob/master/simple-tests-fx/src/main/resources/fxml/TableTest.fxml

HTML:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane xmlns:fx="http://javafx.com/fxml" fx:controller="eu.dzim.tests.fx.controller.TableTestController">
    <center>
        <TableView fx:id="tableView">
            <columns>
                <TableColumn fx:id="tableColumnText" text="Text" prefWidth="150"/>
                <TableColumn fx:id="tableColumnFlag" text="Flag" prefWidth="50"/>
                <TableColumn fx:id="tableColumnAncestor" text="Ancestor" prefWidth="75"/>
                <TableColumn fx:id="tableColumnDescendant" text="Descendant" prefWidth="100"/>
                <TableColumn fx:id="tableColumnPoints" text="Points" prefWidth="75"/>
            </columns>
            <BorderPane.margin>
                <Insets top="5" left="5" right="5" bottom="5"/>
            </BorderPane.margin>
        </TableView>
    </center>
</BorderPane>

Dabei soll dieses Objekt in der Tabelle behandelt werden
https://github.com/bgmf/poc/blob/ma...a/eu/dzim/tests/fx/model/TableTestObject.java

Java:
package eu.dzim.tests.fx.model;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class TableTestObject {
    private StringProperty text = new SimpleStringProperty("");
    private BooleanProperty flag = new SimpleBooleanProperty(false);
    private StringProperty ancestor = new SimpleStringProperty("");
    private StringProperty descendant = new SimpleStringProperty("");
    private IntegerProperty points = new SimpleIntegerProperty(0);
    public final StringProperty textProperty() {
        return this.text;
    }
    public final String getText() {
        return this.textProperty().get();
    }
    public final void setText(final String text) {
        this.textProperty().set(text);
    }
    //  [...] weitere getter, setter und properties
}

Doch der "Trick" ist der Controller:
https://github.com/bgmf/poc/blob/ma.../tests/fx/controller/TableTestController.java

Ich verwende selten PropertyValueFactory sondern mach es meist über Custom "CellValueFactories". Aber das ist mehr eine dumme Angewohnheit von mir.
Wichtiger ist der Part der nicht auf String gemappten Objekte, denn hier baue ich die CellFactory-Callbacks noch selbst.

Java:
package eu.dzim.tests.fx.controller;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import eu.dzim.tests.fx.model.TableTestObject;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ChangeListener;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;

public class TableTestController {
   
    @FXML private TableView<TableTestObject> tableView;
    @FXML private TableColumn<TableTestObject, String> tableColumnText;
    @FXML private TableColumn<TableTestObject, TableTestObject> tableColumnFlag;
    @FXML private TableColumn<TableTestObject, TableTestObject> tableColumnAncestor;
    @FXML private TableColumn<TableTestObject, TableTestObject> tableColumnDescendant;
    @FXML private TableColumn<TableTestObject, TableTestObject> tableColumnPoints;
   
    private Map<String, List<String>> descendantMap;
    private ObservableList<String> ancestorList;
   
    @FXML
    protected void initialize() {
       
        descendantMap = new HashMap<>();
        descendantMap.put("1", Arrays.asList("A", "B", "C"));
        descendantMap.put("2", Arrays.asList("Z", "L", "C"));
        descendantMap.put("3", Arrays.asList("A", "B", "R"));
        descendantMap.put("4", Arrays.asList("C", "B", "E"));
        descendantMap.put("5", Arrays.asList("A", "E", "C"));
        descendantMap.put("6", Arrays.asList("M", "V", "T"));
        descendantMap.put("7", Arrays.asList("A", "G", "F"));
        descendantMap.put("8", Arrays.asList("J", "O", "N"));
        descendantMap.put("9", Arrays.asList("X", "G", "E"));
        descendantMap.put("10", Arrays.asList("H", "I", "J"));
       
        ancestorList = FXCollections.observableArrayList(descendantMap.keySet());
       
        ObservableList<TableTestObject> data = FXCollections.observableArrayList();
        TableTestObject test = new TableTestObject();
        test.setText("Test");
        test.setFlag(true);
        test.setPoints(1);
        data.add(test);
       
        tableView.setItems(data);
       
        tableView.getSelectionModel().selectedItemProperty().addListener((observable, oldObject, newObject) -> {
            System.err.printf(Locale.ROOT, "selection: t[%s], f[%b], p[%d]%n", newObject.getText(), newObject.isFlag(), newObject.getPoints());
        });
       
        tableColumnText.setCellValueFactory(new PropertyValueFactory<>("text"));
        tableColumnFlag.setCellValueFactory(param -> new SimpleObjectProperty<TableTestObject>(param.getValue()));
        tableColumnAncestor.setCellValueFactory(param -> new SimpleObjectProperty<TableTestObject>(param.getValue()));
        tableColumnDescendant.setCellValueFactory(param -> new SimpleObjectProperty<TableTestObject>(param.getValue()));
        tableColumnPoints.setCellValueFactory(param -> new SimpleObjectProperty<TableTestObject>(param.getValue()));
       
        tableColumnFlag.setCellFactory(param -> new TableCell<TableTestObject, TableTestObject>() {
            @Override
            protected void updateItem(TableTestObject item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                } else {
                    CheckBox cb = new CheckBox();
                    cb.selectedProperty().bindBidirectional(item.flagProperty());
                    setGraphic(cb);
                    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                }
            }
        });
        tableColumnAncestor.setCellFactory(param -> new TableCell<TableTestObject, TableTestObject>() {
            @Override
            protected void updateItem(TableTestObject item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                } else {
                    ComboBox<String> cb = new ComboBox<>(ancestorList);
                    cb.getSelectionModel().selectedItemProperty().addListener((ChangeListener<String>) (observable, oldValue, newValue) -> {
                        item.ancestorProperty().set(newValue);
                        System.out.println(item.descendantProperty().get());
                    });
                    setGraphic(cb);
                    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                }
            }
        });
        tableColumnDescendant.setCellFactory(param -> new TableCell<TableTestObject, TableTestObject>() {
            @Override
            protected void updateItem(TableTestObject item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                } else {
                    ComboBox<String> cb = new ComboBox<>();
                    item.ancestorProperty().addListener((ChangeListener<String>) (observable, oldValue, newValue) -> {
                        item.descendantProperty().set("");
                        cb.setItems(FXCollections.observableArrayList(descendantMap.get(newValue)));
                    });
                    cb.getSelectionModel().selectedItemProperty().addListener((ChangeListener<String>) (observable, oldValue, newValue) -> {
                        item.descendantProperty().set(newValue);
                        System.out.println(item.descendantProperty().get());
                    });
                    setGraphic(cb);
                    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                }
            }
        });
        tableColumnPoints.setCellFactory(param -> new TableCell<TableTestObject, TableTestObject>() {
            @Override
            protected void updateItem(TableTestObject item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setText(null);
                } else {
                    Spinner<Integer> spinner = new Spinner<>();
                    spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(-5, +5, item.getPoints()));
                    spinner.valueProperty().addListener((ChangeListener<Integer>) (observable, oldValue, newValue) -> {
                        item.pointsProperty().set(newValue);
                        System.out.println(item.pointsProperty().get());
                    });
                    setGraphic(spinner);
                    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                }
            }
        });
    }
}

Damit du weisst, wie es aussieht:
https://github.com/bgmf/poc/blob/ma...main/java/eu/dzim/tests/fx/MainTableTest.java

Java:
package eu.dzim.tests.fx;

import java.io.IOException;

import eu.dzim.tests.fx.controller.FXMLDocumentController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class MainTableTest extends Application {
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Koordinatensystem");
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainTableTest.class.getResource("/fxml/TableTest.fxml"));
            Pane rootLayout = (Pane) loader.load();
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
}
 
Also wenn du nicht an der Spalte formatieren muss und nur schnell die Spalte initialisieren willst, ist das schon eine schöne Variante. Ohne viel Callbacks instanzieren zu müssen.

Mittlerweile mache ich sogar die Intialisierung der PropertyValueFactory direkt in die FXML. Kann man bestimmt auch bei Custom CellValueFactory auch machen.
 
@mrBrown
ich habe da ( name ) rein geschrieben hat nicht gefunkt und ich habe es hinbekommen um 2:33 uhr
Es wäre deutlich leichter, wenn du auch schreiben würdest, *WAS* mit *WELCHER FEHLERMELDUNG* nicht funktioniert hat.


Java:
albumTable.getItems().setAll(albumsBeans);
name.setCellValueFactory(new PropertyValueFactory<>("name"));
bandName.setCellValueFactory(new PropertyValueFactory<>("bandName"));
Jahr.setCellValueFactory(new PropertyValueFactory<>("erscheinungsJahr"));

funktioniert bei mir ganz wunderbar ohne Probleme.
 
@mrBrown
albumTable.getItems().setAll(albumsBeans);
name.setCellValueFactory(new PropertyValueFactory<>("name"));
bandName.setCellValueFactory(new PropertyValueFactory<>("bandName"));
Jahr.setCellValueFactory(new PropertyValueFactory<>("erscheinungsJahr"));

das hat wunderbar geklappt auch mit (boolen) schreibt zwar false oder true ist noch ein Schönheitsfehler aber ich hab's auch verstanden das der name aus albumsBean kommt.
Hat auch immens den code schlanker gemacht.

eins noch ich habe so was gemacht
Java:
 albumsTable.getItems().setAll(albumsBeans);

        name.setCellValueFactory(new PropertyValueFactory<>("name"));
        bandName.setCellValueFactory(new PropertyValueFactory<>("bandName"));
        jahr.setCellValueFactory(new PropertyValueFactory<>("erscheinungJahr"));

        albumsTable.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> selectetTableColumn(newValue));


und wollte das am Anfang des Controller gleich in der zweiten Tabelle die Auswahl der ersten Zeile automatisch erscheint mit Markierung in der ersten Tabelle und spalte.

also Album 1 Zeile ist ausgewählt erscheint gleich mit in der zweiten die Tracks so das der user nicht erst auswählen muss


schon mal danke dafür
 
Hallo HArry05,

du kannst im Controller mit

Code:
albumsBeans.getSelectionModel.select(0);

vorausgesetzt die Liste enthält schon Einträge.

Grüße
lam
 
und wollte das am Anfang des Controller gleich in der zweiten Tabelle die Auswahl der ersten Zeile automatisch erscheint mit Markierung in der ersten Tabelle und spalte.

also Album 1 Zeile ist ausgewählt erscheint gleich mit in der zweiten die Tracks so das der user nicht erst auswählen muss

Ich habe keine Ahnung was du meinst...


Welches ist die zweite Tabelle und was soll in welcher Tabelle wann automatisch erscheinen?
 
@lam_tr Es ist nicht das was ich heben wollte
@mrBrown
Welches ist die zweite Tabelle und was soll in welcher Tabelle wann automatisch erscheinen?
Sehe das Bild an
die erste Tabelle wird zu erst befüllte
Java:
public void postInit() {
               AlbumsDaoImp albumDao = new AlbumsDaoImp();
      
        System.out.println(StaticContext.userId);
        List<AlbumsBean> albumsBeans = albumDao.loadAlbumsByUserId(StaticContext.userId);

        albumsTable.getItems().setAll(albumsBeans);

        name.setCellValueFactory(new PropertyValueFactory<>("name"));
        bandName.setCellValueFactory(new PropertyValueFactory<>("bandName"));
        jahr.setCellValueFactory(new PropertyValueFactory<>("erscheinungJahr"));
        albumsTable.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> selectetTableColumn(newValue));

    }

jetzt kann man die erste Zeile anwählen so das die zweite Tabelle sich automatisch ausfüllt ohne das der User klicken muss
 

Anhänge

  • dashboard1.png
    dashboard1.png
    59 KB · Aufrufe: 42
@mrBrown
ich glaube ich habs jetzt
Java:
 albumsTable.getSelectionModel().selectFirst();
     
        selectAutomatic( albumsTable.getSelectionModel().selectedItemProperty().get().getId());
macht das Sinn??

jetzt habe ich irgend wie doppelte Methoden
 
Zuletzt bearbeitet:
Hallo Harry05,

wenn du im FXML das defniieren willst, dann kannst du bei TableView über das Attribute onMouseClicked="#onTableClicked" und im Controller implementieren. Über TableView#getSelectionModel()#getSelectionItem() bekommst du die Selektierung.

Ansonsten programatisch kannst du dann genauso über TableView#getSelectionModel()#addListener(new ChangeListener()) machen.

Viele Grüße
lam
 

Neue Themen


Zurück
Oben