checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen

AduVonTubka

Neues Mitglied
Abhängig von einem Zelleninhalt soll in der gleichen Row die Checkbox disabled werden.

Code:
package checkbox;

import javafx.application.Application;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import javafx.util.Callback;

public class TableCellFactorySample extends Application {
    public static final String DONT_MISS = "Love";

    private void init(Stage primaryStage) {
        Group root = new Group();
        primaryStage.setScene(new Scene(root));
        final ObservableList<Needs> data = FXCollections.observableArrayList(new Needs(true, "Gold"),
                new Needs(false, "SUV"), new Needs(true, DONT_MISS), new Needs(true, "Diamonds"),
                new Needs(false, "Boot"));

        TableColumn<Needs, Boolean> neededColumn = new TableColumn<>("Need Things");
        neededColumn.setMinWidth(50);
        neededColumn.setCellValueFactory(
                new Callback<TableColumn.CellDataFeatures<Needs, Boolean>, ObservableValue<Boolean>>() {

                    @Override
                    public ObservableValue<Boolean> call(CellDataFeatures<Needs, Boolean> param) {
                        Needs need = param.getValue();
                        SimpleBooleanProperty needBooleanProperty = new SimpleBooleanProperty(need.isNeeded());
                        needBooleanProperty.addListener(new ChangeListener<Boolean>() {

                            @Override
                            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue,
                                    Boolean newValue) {
                                if (need.getName().equals(DONT_MISS)) {
                                    System.err.println("Avoid changing the Checkbox");
                                } else {
                                    System.err.println("Changing");
                                }
                                System.err.println(need.getName() + " / " + needBooleanProperty + "\n");
                            }
                        });
                        return needBooleanProperty;
                    }
                });

        neededColumn.setCellFactory(//
                new Callback<TableColumn<Needs, Boolean>, TableCell<Needs, Boolean>>() {
                    @Override
                    public TableCell<Needs, Boolean> call(TableColumn<Needs, Boolean> abbreviation) {
                        CheckBoxTableCell<Needs, Boolean> checkBoxTableCell = new CheckBoxTableCell<Needs, Boolean>();
                        checkBoxTableCell.setAlignment(Pos.CENTER);
                        return checkBoxTableCell;
                    }
                });

        TableColumn<Needs, String> nameColumn = new TableColumn<>("Name");
        nameColumn.setCellValueFactory(new PropertyValueFactory<Needs, String>("name"));

        TableView<Needs> tableView = new TableView<>();
        tableView.setItems(data);
        tableView.setEditable(true);
        tableView.getColumns().add(neededColumn);
        tableView.getColumns().add(nameColumn);
        root.getChildren().add(tableView);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        init(primaryStage);
        primaryStage.show();
    }

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

looparda

Top Contributor
Vorweg: Klassen-Namen gern in der Einzahl, also statt Needs - Need.
Anstatt deine Abhängigkeiten "Wenn das den Wert hat, soll auch das andere diesen Wert haben" in deiner UI zu verstreuen extrahierst du eine Klasse NeedViewModel. Diese Klasse enthält für jede Eigenschaft, die du anzeigen möchtest eine entsprechende Property. Beziehungen zwischen den Properties musst du mit Hilfe von Bindings formulieren (hier name.isEqualTo(DONT_MISS);). Wenn sich der Name ändern, dann wird auch dieses Binding neu ausgewertet. Die Checkbox ist an das Binding gebunden und aktualisiert sich dadurch.


Java:
public class TableCellFactorySample extends Application {
    public static final String DONT_MISS = "Love";

    private void init(Stage primaryStage) {
        Group root = new Group();
        ...
        List<Needs> needsSampleList = new ArrayList<>(Arrays.asList(new Needs(true, "Gold"),
                new Needs(false, "SUV"), new Needs(true, DONT_MISS), new Needs(true, "Diamonds"),
                new Needs(false, "Boot")));

        final List<NeedViewModel> needVms = needsSampleList.stream()
                                                           .map(NeedViewModel::new)
                                                           .collect(Collectors.toList());

        final ObservableList<NeedViewModel> data = FXCollections.observableArrayList(needVms);
        ...
        neededColumn.setCellValueFactory(p -> p.getValue().effectiveRequiredProperty());
        neededColumn.setCellFactory(cb -> {
            TableCell<NeedViewModel, Boolean> cell = new TableCell<NeedViewModel, Boolean>() {
                CheckBox check = new CheckBox();
                {
                    getStyleClass().add("check-box-table-cell");
                    check.setOnAction(e -> {
                        e.consume();
                        //TODO
                    });
                }

                @Override
                protected void updateItem(Boolean item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty || item == null) {
                        setText(null);
                        setGraphic(null);
                    } else {
                        check.setSelected(item);
                        setGraphic(check);
                    }
                }
            };
            return cell;
        });

        ...
        nameColumn.setCellFactory(TextFieldTableCell.forTableColumn());
        nameColumn.setEditable(true);
        ...
    }
    ...
    public static class NeedViewModel {
        private final StringProperty name;
        private final BooleanProperty isRequired;

        public NeedViewModel(Needs needs) {
            this.name = new SimpleStringProperty(this, "name", needs.getName());
            this.isRequired = new SimpleBooleanProperty(this, "isRequired", needs.isNeeded());
        }

        public StringProperty nameProperty() {return name;}
        public final String getName(){return name.get();}
        public final void setName(String value){
            name.set(value);}

        public boolean isRequired() {
            return isRequired.get();
        }
        public BooleanProperty isRequiredProperty() {
            return isRequired;
        }
        public void setRequired(final boolean required) {
            this.isRequired.set(required);
        }

        public ObservableBooleanValue effectiveRequiredProperty() {
            return name.isEqualTo(DONT_MISS);
        }
    }

    ...

    public static void main(String[] args) {
        launch(args);
    }
}
Java:
import javafx.application.Application;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableBooleanValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.stage.Stage;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class TableCellFactorySample extends Application {

    public static final String DONT_MISS = "Love";

    private void init(Stage primaryStage) {
        Group root = new Group();
        primaryStage.setScene(new Scene(root));

        List<Needs> needsSampleList = new ArrayList<>(Arrays.asList(new Needs(true, "Gold"),
                new Needs(false, "SUV"), new Needs(true, DONT_MISS), new Needs(true, "Diamonds"),
                new Needs(false, "Boot")));

        final List<NeedViewModel> needVms = needsSampleList.stream()
                                                           .map(NeedViewModel::new)
                                                           .collect(Collectors.toList());

        final ObservableList<NeedViewModel> data = FXCollections.observableArrayList(needVms);

        TableColumn<NeedViewModel, Boolean> neededColumn = new TableColumn<>("Need Things");
        neededColumn.setMinWidth(50);
        neededColumn.setCellValueFactory(p -> p.getValue().effectiveRequiredProperty());
        neededColumn.setCellFactory(cb -> {
            TableCell<NeedViewModel, Boolean> cell = new TableCell<NeedViewModel, Boolean>() {
                CheckBox check = new CheckBox();

                {
                    getStyleClass().add("check-box-table-cell");
                    check.setOnAction(e -> {
                        e.consume();
                        //TODO
                    });
                }

                @Override
                protected void updateItem(Boolean item, boolean empty) {
                    super.updateItem(item, empty);
                    if (empty || item == null) {
                        setText(null);
                        setGraphic(null);
                    } else {
                        check.setSelected(item);
                        setGraphic(check);
                    }
                }
            };
            return cell;
        });

        TableColumn<NeedViewModel, String> nameColumn = new TableColumn<>("Name");
        nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
        nameColumn.setCellFactory(TextFieldTableCell.forTableColumn());
        nameColumn.setEditable(true);

        TableView<NeedViewModel> tableView = new TableView<>();
        tableView.setItems(data);
        tableView.setEditable(true);
        tableView.getColumns().add(neededColumn);
        tableView.getColumns().add(nameColumn);
        root.getChildren().add(tableView);
    }

    public static class NeedViewModel {
        private final StringProperty name;
        private final BooleanProperty isRequired;

        public NeedViewModel(Needs needs) {
            this.name = new SimpleStringProperty(this, "name", needs.getName());
            this.isRequired = new SimpleBooleanProperty(this, "isRequired", needs.isNeeded());
        }

        public StringProperty nameProperty() {return name;}
        public final String getName(){return name.get();}
        public final void setName(String value){
            name.set(value);}

        public boolean isRequired() {
            return isRequired.get();
        }
        public BooleanProperty isRequiredProperty() {
            return isRequired;
        }
        public void setRequired(final boolean required) {
            this.isRequired.set(required);
        }

        public ObservableBooleanValue effectiveRequiredProperty() {
            return name.isEqualTo(DONT_MISS);
        }
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        init(primaryStage);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing JTable zusätzliche Spalte mit einer Checkbox einfügen AWT, Swing, JavaFX & SWT 7
Z AWT Auf bestimmte Checkbox einer Checkboxgroup zugreifen AWT, Swing, JavaFX & SWT 3
T Checkbox in einer Tabelle AWT, Swing, JavaFX & SWT 10
C Aktion nach Auswahl einer Checkbox AWT, Swing, JavaFX & SWT 6
B JavaFX CheckBox mit ChangeListener AWT, Swing, JavaFX & SWT 1
J JavaFx TableView mit CheckBox AWT, Swing, JavaFX & SWT 4
karlmasutra Java FX Checkbox abfragen AWT, Swing, JavaFX & SWT 2
J SceneBuilder TableView Checkbox AWT, Swing, JavaFX & SWT 1
M JAVAFX Checkbox mit URL verlinkung AWT, Swing, JavaFX & SWT 4
A checkbox mit allen tabllen aus datenbank befüllen AWT, Swing, JavaFX & SWT 8
D JIDE TreeComboBox mit checkbox-en kombinieren AWT, Swing, JavaFX & SWT 2
K CheckBox Problem AWT, Swing, JavaFX & SWT 5
Developer_X Java JTable - Combobox + Checkbox - Cellrenderer + Editor AWT, Swing, JavaFX & SWT 3
F JTable mit Checkbox AWT, Swing, JavaFX & SWT 1
T SWT checkbox in table AWT, Swing, JavaFX & SWT 6
M JavaFX TableView mit CheckBox als Boolean AWT, Swing, JavaFX & SWT 5
Z DefaultTableModel + checkbox AWT, Swing, JavaFX & SWT 0
A JXTreeTable mit Checkbox AWT, Swing, JavaFX & SWT 2
P Listenelemente über Checkbox löschen AWT, Swing, JavaFX & SWT 6
D Checkbox - Datenbankausgeben AWT, Swing, JavaFX & SWT 31
A Swing JTable benutzt keine Checkbox für Booleans AWT, Swing, JavaFX & SWT 9
M Swing Dropbox / Checkbox in JTable AWT, Swing, JavaFX & SWT 3
D SWT CheckBox auslesen (Window Builder Pro) AWT, Swing, JavaFX & SWT 2
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
T disabled Checkbox soll trotzdem Focus bekommen AWT, Swing, JavaFX & SWT 9
C Checkbox-zustände in einem JFrame speichern AWT, Swing, JavaFX & SWT 8
C SWT CheckBox AWT, Swing, JavaFX & SWT 6
B Swing DefaultTableModel, Checkbox in Spalte AWT, Swing, JavaFX & SWT 4
C Checkbox in Liste deaktivieren und paintComponent explizit aufrufen AWT, Swing, JavaFX & SWT 12
N JTable RadioButton statt Checkbox AWT, Swing, JavaFX & SWT 4
Semox Swing Random Checkbox JApplet AWT, Swing, JavaFX & SWT 14
S Checkbox AWT, Swing, JavaFX & SWT 4
C jtable checkbox in header / spaltenüberschrift AWT, Swing, JavaFX & SWT 4
T Sprachumstellung per Checkbox, Konzeptfrage AWT, Swing, JavaFX & SWT 16
O CheckBox in Jtable - Listener darauf?? AWT, Swing, JavaFX & SWT 3
W ButtonGroup, Checkbox, A oder B oder gar nix AWT, Swing, JavaFX & SWT 3
G Checkbox AWT, Swing, JavaFX & SWT 7
A Checkbox-Choice Eventproblem (CMV) AWT, Swing, JavaFX & SWT 2
T Checkbox & Textfield AWT, Swing, JavaFX & SWT 5
S Checkbox oder String in JTable-Spalte AWT, Swing, JavaFX & SWT 4
L Checkbox in Tabelle AWT, Swing, JavaFX & SWT 6
G Checkbox, die eine Endlosschleife ausführt AWT, Swing, JavaFX & SWT 3
R CheckBox drücken, sodass eine Aktion ausgeführt wird AWT, Swing, JavaFX & SWT 5
F Häkchen erscheint nicht bei anklicken von Checkbox in JTable AWT, Swing, JavaFX & SWT 4
T Doppelte Abfrage eine Checkbox vermeiden AWT, Swing, JavaFX & SWT 2
F Checkbox transparent machen ? AWT, Swing, JavaFX & SWT 2
N TableModel mit CheckBox? AWT, Swing, JavaFX & SWT 5
D [JList]Checkbox einbinden ? AWT, Swing, JavaFX & SWT 3
L Checkbox in JTable (again), bei true Daten in Header AWT, Swing, JavaFX & SWT 7
F JTable mit Checkbox macht Probleme AWT, Swing, JavaFX & SWT 4
W CheckBox in Jtree AWT, Swing, JavaFX & SWT 6
G Bild als Checkbox bzw gerasteten Button? AWT, Swing, JavaFX & SWT 3
J jTable + jTextarea & checkbox AWT, Swing, JavaFX & SWT 6
V CheckBox in Tabelle zeichnen AWT, Swing, JavaFX & SWT 2
D CheckBox ändert Status nur, wenn sie FocusOwner ist AWT, Swing, JavaFX & SWT 2
C commando mit checkbox AWT, Swing, JavaFX & SWT 5
T selected checkbox AWT, Swing, JavaFX & SWT 2
T Checkbox AWT, Swing, JavaFX & SWT 10
N Checkbox mit mehreren Strings belegen? AWT, Swing, JavaFX & SWT 6
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
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
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
mac2010 JavaFX Einbindung einer Karte AWT, Swing, JavaFX & SWT 1
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
W Aufrufen einer bestimmten Scene mit if-Bedingung AWT, Swing, JavaFX & SWT 4
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
G Verknüpfung einer pdf Datei AWT, Swing, JavaFX & SWT 2
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben