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
 

lam_tr

Top Contributor
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
 

mrBrown

Super-Moderator
Mitarbeiter
Du kannst den Columns eine CellValueFactory setzen, anbieten würde sich da eine PropertyValueFactory.

Das Model „verschmutzen“ mit Properties würde ich nicht.
 

dzim

Top Contributor
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... ;)
 

Harry05

Bekanntes Mitglied
@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 ??
 

Harry05

Bekanntes Mitglied
@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()));
        }
 

mrBrown

Super-Moderator
Mitarbeiter
Daneben geschossen ;)
Java:
name.setCellFactory(new PropertyValueFactory<AlbumsBean,AlbumsBean> („name“);
Müsste passen
 

Harry05

Bekanntes Mitglied
@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

Super-Moderator
Mitarbeiter
@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.
 

Harry05

Bekanntes Mitglied
@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();
            }
        });
 

mrBrown

Super-Moderator
Mitarbeiter
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?)
 

Harry05

Bekanntes Mitglied
@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();
 

mrBrown

Super-Moderator
Mitarbeiter
Du schreibst, du hast dich gegen die Tabelle entschieden (oder meint der Satz was völlig anderes?), postest aber Code für Tabellen^^
 

Harry05

Bekanntes Mitglied
@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
 

mrBrown

Super-Moderator
Mitarbeiter
Wie schon mal geschrieben:
Java:
name.setCellValueFactory(new PropertyValueFactory<AlbumsBean,String>( „name“ ))
Typ der Column entsprechend anpassen.
Ohne Schleife oder sonstiges drumherum.
 

Harry05

Bekanntes Mitglied
@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" ));
 

Harry05

Bekanntes Mitglied
@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ß ???!!!
 

mrBrown

Super-Moderator
Mitarbeiter
Das, was man bei der PropertyFactory angibt, ist der Name das anzuzeigenden Feldes.
Hat deine AlbumBean ein Feld namens „lol“ oder eher nicht?
 

lam_tr

Top Contributor
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
 

dzim

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

Harry05

Bekanntes Mitglied

lam_tr

Top Contributor
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

Super-Moderator
Mitarbeiter
@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.
 

Harry05

Bekanntes Mitglied
@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
 

lam_tr

Top Contributor
Hallo HArry05,

du kannst im Controller mit

Code:
albumsBeans.getSelectionModel.select(0);

vorausgesetzt die Liste enthält schon Einträge.

Grüße
lam
 

mrBrown

Super-Moderator
Mitarbeiter
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?
 

Harry05

Bekanntes Mitglied
@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

Super-Moderator
Mitarbeiter
Du kannst dem Selection-Model einen Listener geben, und entsprechend den Content der zweiten Tabelle setzen
 

Harry05

Bekanntes Mitglied
@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:

lam_tr

Top Contributor
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Georges456 NetBeans am Mac leider ohne FXML AWT, Swing, JavaFX & SWT 17
R Fxml findet controller nicht AWT, Swing, JavaFX & SWT 2
thor_norsk JavaFX, FXML und SceneBuilder AWT, Swing, JavaFX & SWT 6
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
G JavaFX Wert aus DB lesen, wenn erfolgreich automatisch eine fxml laden, möglich? AWT, Swing, JavaFX & SWT 2
N Braucht man fxml AWT, Swing, JavaFX & SWT 3
S Fehler beim Öffnen weiterer FXML AWT, Swing, JavaFX & SWT 11
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
M mvvm umsetzen ohne fxml AWT, Swing, JavaFX & SWT 0
L JavaFX .fxml laden klappt nicht AWT, Swing, JavaFX & SWT 16
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J JavaFX - Included FXML - Entfernen feststellen AWT, Swing, JavaFX & SWT 2
L JavaFX javafx.fxml.LoadException bei einem Taschenrechner AWT, Swing, JavaFX & SWT 5
G JavaFX Verständnisfrage mit parametrisierten Methoden und FXML AWT, Swing, JavaFX & SWT 21
Ø Ein FXML-File mehrfach einfügen AWT, Swing, JavaFX & SWT 6
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
OSchriever Auf Stage von FXML-Controller zugreifen AWT, Swing, JavaFX & SWT 12
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
R FXML File kann nicht hinzugefügt werden! AWT, Swing, JavaFX & SWT 2
J FXML - Internationalisierung - Behandung key not found AWT, Swing, JavaFX & SWT 39
J import javafx.fxml* bei JavaFX 13 geht nicht mehr AWT, Swing, JavaFX & SWT 7
S JavaFX Variablen in einem FXML File verwenden AWT, Swing, JavaFX & SWT 8
T Fxbefehle aus Main umwandeln in @FXML AWT, Swing, JavaFX & SWT 21
L JavaFX JavaFX, FXML und Guice? AWT, Swing, JavaFX & SWT 0
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
TheWhiteShadow JavaFX Dependencies in fxml AWT, Swing, JavaFX & SWT 17
M JavaFX Altes Fenster (FXML Datei) löschen AWT, Swing, JavaFX & SWT 16
R JavaFX Java FXML Vererbung in Klassen AWT, Swing, JavaFX & SWT 9
F Java FX Von der Fxml Datei zum Objekt AWT, Swing, JavaFX & SWT 8
F FXML Datei aus dem SceneBuilder in Eclipse aufrufen AWT, Swing, JavaFX & SWT 1
I MediaPlayer (MediaView) in FXML (source) AWT, Swing, JavaFX & SWT 0
I FXML: StackPane als Root-Element AWT, Swing, JavaFX & SWT 5
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
MiMa Übergeben von Paramter bei FXML Aufruf? AWT, Swing, JavaFX & SWT 8
MiMa Wie bettet man Programmcode in JavaFX FXML ein? AWT, Swing, JavaFX & SWT 34
B FXML GUI - Button ausblenden AWT, Swing, JavaFX & SWT 1
D JavaFX Einbinden einer .fxml AWT, Swing, JavaFX & SWT 1
S java.fxml.load.exception und keine automatische Aktualliseriung der Mainausgabe AWT, Swing, JavaFX & SWT 5
L JavaFX Zugriff auf HostServices im FXML Controller AWT, Swing, JavaFX & SWT 1
T Pfad zur *.fxml AWT, Swing, JavaFX & SWT 8
D Java FXML mehrere Fenster AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX FXML vs. Java Code AWT, Swing, JavaFX & SWT 3
L Liniendiagramme mit FXML: Quellen mit konkreten Beispielen AWT, Swing, JavaFX & SWT 0
S JavaFX fxml datein mit menübar ändern AWT, Swing, JavaFX & SWT 20
K JavaFX JavaFX und FXML AWT, Swing, JavaFX & SWT 6
F Problem mit der FXML Rectangle Shape AWT, Swing, JavaFX & SWT 2
H JavaFX aus der .fxml Datei einen Konstruktor bedienen AWT, Swing, JavaFX & SWT 3
H JavaFX via .fxml einen abgeleiteten Button erstellen... AWT, Swing, JavaFX & SWT 4
E Java FX FXML Problem mit html Scriptausführung AWT, Swing, JavaFX & SWT 2
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
U JavaFX Zeichenprogramm mit JavaFX FXML AWT, Swing, JavaFX & SWT 7
B Java FX FXML Textarea SceneBuilder als XML Editor AWT, Swing, JavaFX & SWT 1
C JavaFX Tiefgestellte Zeichen in fxml AWT, Swing, JavaFX & SWT 2
M Java FX SceneBuilder 2.0, FXML, Controller AWT, Swing, JavaFX & SWT 1
B FXML-Layoutdateien schützen AWT, Swing, JavaFX & SWT 4
7 JavaFX Verwendung einer ResizableCanvas-Klasse in fxml-Datei AWT, Swing, JavaFX & SWT 3
C JavaFX Auf Nodes einer FXML-Datei in start Methode zugreifen AWT, Swing, JavaFX & SWT 5
KrokoDiehl JavaFX Gleiche Controller-Instanz für inludiertes FXML AWT, Swing, JavaFX & SWT 1
I Scene Builder kann .fxml nicht mehr laden AWT, Swing, JavaFX & SWT 3
S JavaFX FXML-Editor mit Java 7? AWT, Swing, JavaFX & SWT 2
J JavaFX Zugriff auf FXML-Variablen eines anderen Controllers AWT, Swing, JavaFX & SWT 2
X Java Fxml laden AWT, Swing, JavaFX & SWT 4
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
M JavaFX FXML Standartgröße festlegen AWT, Swing, JavaFX & SWT 5
L JavaFX Verständnisfrage zu JavaFX FXML und Controller-Klasse AWT, Swing, JavaFX & SWT 1
Z JavaFX Inhalt einer ViewTable durch Aktion einer Menubar ändern welche in einer anderen fxml ist AWT, Swing, JavaFX & SWT 4
wolfgang63 JavaFX Zugriff auf Guiobjekte die über FXML erstellt wurden AWT, Swing, JavaFX & SWT 2
D JavaFX @FXML Annotation mit Klassen und Instanzen verbinden? AWT, Swing, JavaFX & SWT 5
A Databinding in FXML-Datei AWT, Swing, JavaFX & SWT 1
K JavaFX Erzeugen dynamischer Layouts in fxml AWT, Swing, JavaFX & SWT 3
M JavaFX Stage in einer FXML-Controllerklasse ermitteln? AWT, Swing, JavaFX & SWT 5
G Swing, JavaFx - Felder aus FXML sind null AWT, Swing, JavaFX & SWT 6
M JavaFX Von FXML-Controllerdatei Daten zurückgeben AWT, Swing, JavaFX & SWT 6
M Komplexe Eingabenmasken in FXML definieren? AWT, Swing, JavaFX & SWT 17
M Java FX Innerhalb einem FXML-Dialog weiteren FXML-Dialog einblenden AWT, Swing, JavaFX & SWT 3
E JavaFX fxml files wechseln AWT, Swing, JavaFX & SWT 4
H Taschenrechnerprojekt in Javafx - Frage zu den Buttons in FXML AWT, Swing, JavaFX & SWT 1
T JavaFX FXMLController für mehrere FXML? AWT, Swing, JavaFX & SWT 7
M JavaFX Parameter für Custom Control in FXML übergeben? AWT, Swing, JavaFX & SWT 4
C JavaFX Fxml and stylecheets AWT, Swing, JavaFX & SWT 5
N FXML Dokument laden AWT, Swing, JavaFX & SWT 1
Tort-E JavaFX FXML Grundsatzfrage AWT, Swing, JavaFX & SWT 2
K Controls in Controls / Nested fxml AWT, Swing, JavaFX & SWT 1
D JavaFX Mysteriöser Dropshadow hinter Tablabelschrift - Schatten kann nicht entfernt werden (FXML + CSS) AWT, Swing, JavaFX & SWT 6
G JavaFX NullPointerException bei Zugriff auf FXML Element AWT, Swing, JavaFX & SWT 0
S JavaFX FXML AWT, Swing, JavaFX & SWT 3
G JavaFX Fxml AWT, Swing, JavaFX & SWT 2
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
F JavaFX Auf FXML ImageView zugreifen AWT, Swing, JavaFX & SWT 6
S Aus XML Datei FXML generieren AWT, Swing, JavaFX & SWT 4
B JavaFX FXML - Eclipse einrichten AWT, Swing, JavaFX & SWT 2
V JavaFX - fxml-Datei laden (neben CSS) AWT, Swing, JavaFX & SWT 2
dzim UI aus FXML und Java gemischt - NPE? AWT, Swing, JavaFX & SWT 4
V Guis erstellen mit FXML und javaFX gemischt AWT, Swing, JavaFX & SWT 5
M JavaFX TableView nur erste Zeile editable machen und gelb markieren AWT, Swing, JavaFX & SWT 0
Encera TableView Zeilen als Spalten im SceneBuilder AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben