JavaFX TableColumns mit CellFactory setzen

L

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

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)
 
L

lam_tr

Top Contributor
Was willst du denn erreichen? (Also mit dem Code, wo du die unbekannten TableCell setzt, das sieht eigentlich überflüssig aus)
Ich will die TableCell erweitern mit Custom Control, und wenn das zweite Argument nicht bekannt ist, kann ich die updateItem Methode nicht überschreiben.
 
mihe7

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);
}
 
L

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;
            }
        });
    }
 
L

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.
 
mihe7

mihe7

Top Contributor
Du brauchst schon zwei Typvariablen. Mach mal <S,T> draus. Oben war S ja fix Person.
 
L

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
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
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
L Fenster inaktiv setzen / deaktivieren (unable to close window) AWT, Swing, JavaFX & SWT 16
T Schließen eines JDialogs setzen den JFrame in den Hintergrund AWT, Swing, JavaFX & SWT 2
C Breite JTextArea/JScrollPane setzen AWT, Swing, JavaFX & SWT 4
O JTable Zelle mit "ENTER" in Editmode setzen AWT, Swing, JavaFX & SWT 4
M Cursor setzen im JTextPane AWT, Swing, JavaFX & SWT 3
I Swing JComboBox Wert setzen AWT, Swing, JavaFX & SWT 4
V Swing Problem mit Focus setzen AWT, Swing, JavaFX & SWT 7
FuriKuri LookAndFeel in Linux setzen AWT, Swing, JavaFX & SWT 16
R setPreferredSize - nur in einer Richtung setzen? AWT, Swing, JavaFX & SWT 8
S Columnbreite auf 100px setzen? AWT, Swing, JavaFX & SWT 4
P Schriftart setzen für die ganze Applikation AWT, Swing, JavaFX & SWT 3
S swt table mit checkboxen: wie nachträglich im code setzen? AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Anzeige

Neue Themen


Oben