JavaFX TableColumns mit CellFactory setzen

lam_tr

Top Contributor
Hallo zusammen,

wie kann ich in JavaFX die CellFactory setzen wenn der zweite Generic Parameter von einer TableColumn nicht bekannt ist? Aktuell versuche ich es, schaffe aber den Compile-Error nicht weg zu bekommen.

Code:
package com.rockwell.ssb.serialization.monitor.controller.sig;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;

public class TableViewSample extends Application {

    private TableView<Person> table = new TableView<Person>();

    private final ObservableList<Person> data = FXCollections.observableArrayList(
            new Person("Jacob", "Smith", "jacob.smith@example.com"),
            new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
            new Person("Ethan", "Williams", "ethan.williams@example.com"),
            new Person("Emma", "Jones", "emma.jones@example.com"),
            new Person("Michael", "Brown", "michael.brown@example.com"));

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setTitle("Table View Sample");
        stage.setWidth(450);
        stage.setHeight(500);

        final Label label = new Label("Address Book");
        label.setFont(new Font("Arial", 20));

        table.setEditable(true);

        TableColumn firstNameCol = new TableColumn("First Name");
        firstNameCol.setMinWidth(100);
        firstNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("firstName"));

        TableColumn lastNameCol = new TableColumn("Last Name");
        lastNameCol.setMinWidth(100);
        lastNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("lastName"));

        TableColumn emailCol = new TableColumn("Email");
        emailCol.setMinWidth(200);
        emailCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("email"));

        table.setItems(data);
        table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);

        for (TableColumn<Person, ?> column : table.getColumns()) {
            column.setCellFactory(new Callback<TableColumn<Person,>, TableCell<Person,>>() {
                @Override
                public TableCell<Person, ?> call(TableColumn<Person, ?> param) {
                    return new TableCell<>(){
                    };
                }
            });
        }

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(label, table);

        ((Group) scene.getRoot()).getChildren().addAll(vbox);

        stage.setScene(scene);
        stage.show();
    }

    public static class Person {

        private final SimpleStringProperty firstName;

        private final SimpleStringProperty lastName;

        private final SimpleStringProperty email;

        private Person(String fName, String lName, String email) {
            this.firstName = new SimpleStringProperty(fName);
            this.lastName = new SimpleStringProperty(lName);
            this.email = new SimpleStringProperty(email);
        }

        public String getFirstName() {
            return firstName.get();
        }

        public void setFirstName(String fName) {
            firstName.set(fName);
        }

        public String getLastName() {
            return lastName.get();
        }

        public void setLastName(String fName) {
            lastName.set(fName);
        }

        public String getEmail() {
            return email.get();
        }

        public void setEmail(String fName) {
            email.set(fName);
        }
    }
}

das Problem liegt an der Stelle

Code:
        for (TableColumn<Person, ?> column : table.getColumns()) {

            column.setCellFactory(new Callback<TableColumn<Person,>, TableCell<Person,>>() {

                @Override

                public TableCell<Person, ?> call(TableColumn<Person, ?> param) {

                    return new TableCell<>(){

                    };

                }

            });

        }

Wie kriege ich das Fragezeichen weg? der TableColumn<T, S> wobei T schon gesetzt ist und S noch ? bleibt.

An sich ist das eher eine Generic Frage als JavaFX.

Grüße
lam
 

mrBrown

Super-Moderator
Mitarbeiter
Was willst du denn erreichen? (Also mit dem Code, wo du die unbekannten TableCell setzt, das sieht eigentlich überflüssig aus)
 

mihe7

Top Contributor
Lagere den Code in eine Methode aus:
Java:
private <T> void setupPersonCellFactory(TableColumn<Person, T> col) {
...
}
In der Schleife:
Java:
for (TableColumn<Person, ?> column : table.getColumns()) {
    setupPersonCellFactory(column);
}
 

lam_tr

Top Contributor
Lagere den Code in eine Methode aus:
Java:
private <T> void setupPersonCellFactory(TableColumn<Person, T> col) {
...
}
In der Schleife:
Java:
for (TableColumn<Person, ?> column : table.getColumns()) {
    setupPersonCellFactory(column);
}
Ich bekomme da immer noch ein compile error

Code:
    public FilteredTableView<T> setColumnText(String currentName, String newName) {
        for (TableColumn<T, ?> column : getColumns()) {
            if (column.getText().equals(currentName.toUpperCase())) {
                column.setText(newName);
                setupPersonCellFactory(column);
            }
        }
        return this;
    }
    
    private <T> void setupPersonCellFactory(TableColumn<T, T> column) {
        column.setCellFactory(new Callback<TableColumn<T,T>, TableCell<T,T>>() {
            @Override
            public TableCell<T, T> call(TableColumn<T, T> param) {
                // TODO Auto-generated method stub
                return null;
            }
        });
    }
 

lam_tr

Top Contributor
Ich habe jetzt einen megahässlichen Weg gefunden wie man es machen kann.

Code:
    public FilteredTableView<T> setColumnText(String currentName, String newName) {
        for (TableColumn<T, ?> column : getColumns()) {
            if (column.getText().equals(currentName.toUpperCase())) {
                column.setText(newName);
                setupPersonCellFactory(column, new TableCell<T, Object>(){
                    @Override
                    protected void updateItem(Object item, boolean empty) {
                        super.updateItem(item, empty);
                    }
                });
            }
        }
        return this;
    }
   
    private void setupPersonCellFactory(TableColumn column, TableCell<T, Object> tableCell) {
        column.setCellFactory(param -> tableCell);
    }

Vielleicht kennt da jemand eine bessere Lösung. Ich gebe TableColumn ohne Argumente mit. Als Nachteil habe ich nur Typ Object und müsste es in der Update Methode casten.
 

lam_tr

Top Contributor
Ach du hast recht, so gehts :)

Code:
public FilteredTableView<T> setColumnValue(String currentName, String newName) {
        for (TableColumn<T, ?> column : getColumns()) {
            if (column.getText().equals(currentName.toUpperCase())) {
                column.setText(newName);
                setupPersonCellFactory(column, new TableCell<T, Double>(){
                    @Override
                    protected void updateItem(Double item, boolean empty) {
                        super.updateItem(item, empty);
                    }
                });
            }
        }
        return this;
    }
  
    private <S> void setupPersonCellFactory(TableColumn column, TableCell<T, S> tableCell) {
        column.setCellFactory(param -> tableCell);
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
missy72 JavaFX CellFactory deaktivieren, oder löschen AWT, Swing, JavaFX & SWT 2
T ListView nach Erweiterung Fehler in CellFactory AWT, Swing, JavaFX & SWT 8
temi JavaFX CellFactory und CellValueFactory AWT, Swing, JavaFX & SWT 2
K TreeTableView (cellFactory) - wie Daten in Spalten einfügen AWT, Swing, JavaFX & SWT 0
B TreeView cellFactory AWT, Swing, JavaFX & SWT 4
V JavaFX Zwei Dinge in einer CellFactory erledigen AWT, Swing, JavaFX & SWT 8
J CellFactory in Abhängigkeit von anderer Zelle AWT, Swing, JavaFX & SWT 4
M JavaFX CellFactory Best Practice AWT, Swing, JavaFX & SWT 1
B Erstellen eigener Combobox ("CellFactory") AWT, Swing, JavaFX & SWT 4
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
S TableCellRender - Zelle auf editier-/anklickbar setzen AWT, Swing, JavaFX & SWT 5
berserkerdq2 Anchorpane warum kann ich nicht Anchors setzen AWT, Swing, JavaFX & SWT 6
_user_q ThreadPool schedule Wert auf false setzen AWT, Swing, JavaFX & SWT 1
E verschiedene Cursor setzen AWT, Swing, JavaFX & SWT 1
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
izoards *.doc Seitenränder per Java setzen... AWT, Swing, JavaFX & SWT 14
G Button Strings Effektiver setzen AWT, Swing, JavaFX & SWT 3
W Bounds setzen AWT, Swing, JavaFX & SWT 1
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
J Standardwert in Choicebox setzen ? AWT, Swing, JavaFX & SWT 0
C Kleineres Bild an bestimmte Koordinaten setzen AWT, Swing, JavaFX & SWT 6
T Setzen von der Schriftgröße bei einem Shell AWT, Swing, JavaFX & SWT 15
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
K Swing DefaultListModel braucht zu lange, um Wert zu setzen AWT, Swing, JavaFX & SWT 7
L JavaFX Fehler beim setzen von Farben AWT, Swing, JavaFX & SWT 16
D JavaFX ComboBox String setzen AWT, Swing, JavaFX & SWT 20
S JButtons an Koordinaten setzen AWT, Swing, JavaFX & SWT 3
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
F Icons neben Text in Listview setzen AWT, Swing, JavaFX & SWT 2
C JavaFX Tief setzen in der Überschrift einer Tabellenspalte AWT, Swing, JavaFX & SWT 3
Thallius JScrollPane Scrollpos setzen nach Neuzeichnen AWT, Swing, JavaFX & SWT 3
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JScrollPane Position setzen (x=0, y=0) AWT, Swing, JavaFX & SWT 2
wolfgang63 JavaFX von controllerclass primarystage Titel setzen AWT, Swing, JavaFX & SWT 4
F Setzen des LookAndFeel AWT, Swing, JavaFX & SWT 4
M Swing Shapes setzen AWT, Swing, JavaFX & SWT 4
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
W JTextfield - Wert lässt sich nicht setzen AWT, Swing, JavaFX & SWT 3
H JavaFX GridPane: Zellenfarbe setzen AWT, Swing, JavaFX & SWT 9
B Swing JMenuBar unten in der Frame setzen? AWT, Swing, JavaFX & SWT 15
U Tooltip Dauer setzen AWT, Swing, JavaFX & SWT 0
A JTable schreibschutz setzen bzw. aufheben AWT, Swing, JavaFX & SWT 2
TheWhiteShadow SWT Dialog Titel setzen AWT, Swing, JavaFX & SWT 6
R SWT TreeViewer neuen Input setzen AWT, Swing, JavaFX & SWT 3
Kenan89 Java FX ScrollPane Content mittig setzen AWT, Swing, JavaFX & SWT 5
B Swing Fokus auf JPanel setzen AWT, Swing, JavaFX & SWT 2
A HELP: JFieldText dynamisch setzen -> langsam AWT, Swing, JavaFX & SWT 19
C Swing Hintergrundfarbe von Submenüeinträgen setzen AWT, Swing, JavaFX & SWT 2
P jTable model setzen AWT, Swing, JavaFX & SWT 6
J Swing JInternalFrame modal setzen? AWT, Swing, JavaFX & SWT 13
J Swing JMenuItem auf setEnabled(false) setzen? AWT, Swing, JavaFX & SWT 3
S Swing Setzen von TableModel liefert NullPointer AWT, Swing, JavaFX & SWT 6
I LookAndFeel setzen AWT, Swing, JavaFX & SWT 17
GianaSisters AWT Per Button neues Element auf den jPanel setzen AWT, Swing, JavaFX & SWT 6
C SWT Curser an den Anfang eines Text Objektes setzen AWT, Swing, JavaFX & SWT 12
C SWT Curser an den Anfang eines Textes setzen AWT, Swing, JavaFX & SWT 2
C Tooltip dynamisch setzen AWT, Swing, JavaFX & SWT 7
L Swing Fenstergröße setzen (Netbeans) AWT, Swing, JavaFX & SWT 6
F Font in JTable setzen AWT, Swing, JavaFX & SWT 7
J JPanel mit anderem Panel aus anderer Klasse setzen AWT, Swing, JavaFX & SWT 4
A Applet Bild als Button setzen... AWT, Swing, JavaFX & SWT 6
G SWT Fokus auf MsgBox setzen AWT, Swing, JavaFX & SWT 3
G Swing Höhe des View eines JScrollPane fest auf Höhe des JScrollPane setzen! AWT, Swing, JavaFX & SWT 4
M Zugriff auf Variablen eines Objektes ohne sie auf static zu setzen AWT, Swing, JavaFX & SWT 9
B Swing Eigenen Cursor setzen AWT, Swing, JavaFX & SWT 10
B JColorChooser - Locale setzen AWT, Swing, JavaFX & SWT 3
Dit_ JTextField | Text auswählen und Caret setzen AWT, Swing, JavaFX & SWT 7
R Swing Layout setzen AWT, Swing, JavaFX & SWT 3
D LookAndFeel setzen AWT, Swing, JavaFX & SWT 2
Y LookAndFeel JTabbedPane: Tab-Farbe mit Nimbus setzen AWT, Swing, JavaFX & SWT 3
C Swing JEditorPane: Caret nach Rechtsklick neu setzen AWT, Swing, JavaFX & SWT 4
X Einem JFrame einen Dialog als Parent setzen. Möglich? AWT, Swing, JavaFX & SWT 4
P Swing JPanel über Methode setzen AWT, Swing, JavaFX & SWT 2
A Fokus wieder in ein JTextField setzen AWT, Swing, JavaFX & SWT 4
F LayoutManager GridLayout 0/0 auf andere Ecke setzen AWT, Swing, JavaFX & SWT 4
J Swing Wie Fokus richtig setzen? AWT, Swing, JavaFX & SWT 7
J JTextPane Background setzen AWT, Swing, JavaFX & SWT 6
D JPanel höhe setzen AWT, Swing, JavaFX & SWT 2
E Swing TableCellRenderer für alle Splaten setzen?! AWT, Swing, JavaFX & SWT 3
D Setzen eines Fonts in einem BasicMenuUI AWT, Swing, JavaFX & SWT 3
Q 3D-Grafik Cube Farbe setzen zur Laufzeit. AWT, Swing, JavaFX & SWT 10
G Problem beim setzen des Fokus AWT, Swing, JavaFX & SWT 4
L AWT Focus auf Fenster setzen AWT, Swing, JavaFX & SWT 4
E Swing Mit rechter Maustaste Fokus in JList setzen?! AWT, Swing, JavaFX & SWT 3
F Rechte Maustaste auf TreeNode soll den Fokus auf diese setzen AWT, Swing, JavaFX & SWT 6
X Den Wert von JSpinner setzen ohne Event AWT, Swing, JavaFX & SWT 3
S Swing: Look and Feel abändern oder für Teilkomponenten anderes LaF setzen AWT, Swing, JavaFX & SWT 2
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
N Mnemonic setzen AWT, Swing, JavaFX & SWT 4
Airwolf89 Swing Anzahl der Tabellenspalten dynamisch setzen AWT, Swing, JavaFX & SWT 2
P Swing Hintergrundfarbe auslesen und wieder setzen AWT, Swing, JavaFX & SWT 4
Z Fokus auf Eingabefeld bei showMessageDialog setzen AWT, Swing, JavaFX & SWT 3
H JList in JScrollPane -> ScrollBar ans Ende setzen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben