Skip to content

Instantly share code, notes, and snippets.

@CAD97
Last active February 23, 2016 22:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CAD97/880b3278e2639fdb5b52 to your computer and use it in GitHub Desktop.
Save CAD97/880b3278e2639fdb5b52 to your computer and use it in GitHub Desktop.
Dependent ComboBoxColumn
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.VBox?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.FXMLDocumentController">
<children>
<TableView fx:id="table" editable="true">
<columns>
<TableColumn fx:id="baseColumn" prefWidth="75.0" text="BASE" />
<TableColumn fx:id="numbColumn" prefWidth="75.0" text="VALUE" />
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TableView>
<Button maxWidth="1.7976931348623157E308" mnemonicParsing="false" onAction="#addValue" text="Button" />
</children>
</VBox>
package test;
import java.lang.reflect.Field;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.function.Supplier;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.binding.Bindings;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.ComboBoxTableCell;
import javafx.scene.control.cell.PropertyValueFactory;
public class FXMLDocumentController implements Initializable {
@FXML TableView<Data> table;
@FXML TableColumn<Data, BASE> baseColumn;
@FXML TableColumn<Data, Enum> numbColumn;
@Override
public void initialize(URL url, ResourceBundle rb) {
baseColumn.setCellValueFactory(new PropertyValueFactory<>("base"));
numbColumn.setCellValueFactory(new PropertyValueFactory<>("numb"));
baseColumn.setCellFactory(ComboBoxTableCell.forTableColumn(BASE.values()));
baseColumn.setOnEditCommit(e -> {
e.getRowValue().setBase(e.getNewValue());
});
numbColumn.setCellFactory(c -> {
TransparentComboBoxTableCell<Data, Enum> tcbtc = new TransparentComboBoxTableCell<>();
tcbtc.comboBox.setOnShown(e -> {
if (!tcbtc.comboBox.itemsProperty().isBound()) tcbtc.comboBox.itemsProperty().bind(
Bindings.when(tcbtc.tableValue.get().base.isEqualTo(BASE.EVEN)).then(evens).otherwise(
Bindings.when(tcbtc.tableValue.get().base.isEqualTo(BASE.ODD)).then(odds).otherwise(
FXCollections.emptyObservableList()
))
);
});
return tcbtc;
});
numbColumn.setOnEditCommit(e -> {
e.getRowValue().setNumb(e.getNewValue());
});
}
@FXML void addValue() {
table.getItems().add(new Data());
}
public static class Data {
public ObjectProperty<BASE> base = new SimpleObjectProperty<>(BASE.EVEN);
public ObjectProperty<Enum> numb = new SimpleObjectProperty<>(EVEN.TWO);
public BASE getBase() {return base.get();}
public void setBase(BASE b) {base.set(b);}
public Enum getNumb() {return numb.get();}
public void setNumb(Enum s) {numb.set(s);}
}
public static enum BASE {EVEN, ODD}
public static enum EVEN {TWO, FOUR, SIX, EIGHT, TEN}
public static enum ODD {ONE, THREE, FIVE, SEVEN, NINE}
public static ObservableList<Enum> evens = FXCollections.observableArrayList(EVEN.values());
public static ObservableList<Enum> odds = FXCollections.observableArrayList(ODD.values());
public static class TransparentComboBoxTableCell<S, T> extends ComboBoxTableCell<S, T> {
public TransparentComboBoxTableCell() {
this(FXCollections.observableArrayList());
}
public TransparentComboBoxTableCell(ObservableList<T> startingItems) {
super(startingItems);
try {
Field f = ComboBoxTableCell.class.getDeclaredField("comboBox");
f.setAccessible(true);
f.set(this, new ComboBox<>());
comboBox = (ComboBox<T>) f.get(this);
// Setup out of javafx.scene.control.cell.CellUtils.createComboBox
// comboBox.converterProperty().bind(converter);
comboBox.setMaxWidth(Double.MAX_VALUE);
comboBox.getSelectionModel().selectedItemProperty().addListener((ov, oldValue, newValue) -> {
if (this.isEditing()) {
this.commitEdit((T) newValue);
}
});
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
throw new Error("Error extracting 'comboBox' from ComboBoxTableCell", ex);
}
tableValue = () -> (S) this.getTableRow().getItem();
}
public final ComboBox<T> comboBox;
public final Supplier<S> tableValue;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment