1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
| package test;
import java.net.URL;
import java.util.LinkedList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.property.ListProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.adapter.JavaBeanBooleanPropertyBuilder;
import javafx.beans.property.adapter.JavaBeanStringPropertyBuilder;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.util.Callback;
public final class TestController implements Initializable {
@FXML
private TableView<Truc> tableView;
////////////////////////////////////////////////////////////////////////////
// JavaFX properties.
@FXML
private TableColumn<Truc, Boolean> visibleColumn;
@FXML
private TableColumn<Truc, String> nameColumn;
////////////////////////////////////////////////////////////////////////////
// Java Beans properties.
@FXML
private TableColumn<Truc, Boolean> opaqueColumn;
@FXML
private TableColumn<Truc, String> commentColumn;
////////////////////////////////////////////////////////////////////////////
// Java Beans properties.
@FXML
private TableColumn<Truc, Boolean> administratorColumn;
@FXML
private TableColumn<Truc, String> emailColumn;
@Override
public void initialize(URL url, ResourceBundle rb) {
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
tableView.itemsProperty().bind(trucs);
////////////////////////////////////////////////////////////////////////
// JavaFX properties.
visibleColumn.setCellValueFactory(new PropertyValueFactory<Truc, Boolean>("visible"));
visibleColumn.setCellFactory(CheckBoxTableCell.forTableColumn(visibleColumn));
nameColumn.setCellValueFactory(new PropertyValueFactory<Truc, String>("name"));
nameColumn.setCellFactory(TextFieldTableCell.<Truc>forTableColumn());
////////////////////////////////////////////////////////////////////////
// Java Beans properties.
opaqueColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Truc, Boolean>, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Truc, Boolean> p) {
final Truc t = p.getValue();
try {
return JavaBeanBooleanPropertyBuilder.create().bean(t).name("opaque").build();
} catch (NoSuchMethodException ex) {
Logger.getLogger(TestController.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
});
opaqueColumn.setCellFactory(CheckBoxTableCell.forTableColumn(opaqueColumn));
commentColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Truc, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Truc, String> p) {
final Truc t = p.getValue();
try {
return JavaBeanStringPropertyBuilder.create().bean(t).name("comment").build();
} catch (NoSuchMethodException ex) {
Logger.getLogger(TestController.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
});
commentColumn.setCellFactory(TextFieldTableCell.<Truc>forTableColumn());
////////////////////////////////////////////////////////////////////////
// Other.
administratorColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Truc, Boolean>, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Truc, Boolean> p) {
final Truc t = p.getValue();
ObservableValue<Boolean> result = new SimpleBooleanProperty(t.administrator);
// Hack to bypass the issue where the onEditCommit handler on the administratorColumn is never called.
result.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean oldValue, Boolean newValue) {
t.administrator = newValue;
}
});
return result;
}
});
administratorColumn.setCellFactory(CheckBoxTableCell.forTableColumn(administratorColumn));
administratorColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Truc, Boolean>>() {
@Override
public void handle(TableColumn.CellEditEvent<Truc, Boolean> editEvent) {
// This method is never called! (see above for a fix).
final Truc t = (Truc) editEvent.getTableView().getItems().get(editEvent.getTablePosition().getRow());
t.administrator = editEvent.getNewValue();
}
});
emailColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Truc, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Truc, String> p) {
final Truc t = p.getValue();
return new SimpleStringProperty(t.email);
}
});
emailColumn.setCellFactory(TextFieldTableCell.<Truc>forTableColumn());
emailColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Truc, String>>() {
@Override
public void handle(TableColumn.CellEditEvent<Truc, String> editEvent) {
// Called ok.
final Truc t = (Truc) editEvent.getTableView().getItems().get(editEvent.getTablePosition().getRow());
t.email = editEvent.getNewValue();
}
});
}
////////////////////////////////////////////////////////////////////////////
private final ListProperty<Truc> trucs = new SimpleListProperty<>(FXCollections.observableList(new LinkedList()));
public final ObservableList<Truc> getTrucs() {
return trucs;
}
} |
Partager