I defined a TableView with 4 columns, the first 3 of them should be editable. The fourth column is the mathematical result of the difference of the second (expenses) and third (earnings) one. I managed this so far but when I edit the second or third column the fourth column dont get updatet. I tried different approaches but it didnt work. The problem is that I dont know how to get access to the neighbouring cell.
package application;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
public class Main extends Application {
private TableView<Member> table = new TableView<>();
//private final ObservableList<Member> data = FXCollections.observableArrayList();
@SuppressWarnings("unchecked")
@Override
public void start(Stage primaryStage) {
try {
//Definition Layout-Container
GridPane primarygridpane = new GridPane();
primarygridpane.setHgap(10);
primarygridpane.setVgap(10);
primarygridpane.setPadding(new Insets(5, 5, 5, 5));
HBox hboxTable = new HBox(10);
hboxTable.setPadding(new Insets(5, 5, 5, 5));
Text titel = new Text("Application");
titel.setFont(Font.font("Arial", FontWeight.BOLD, 28));
// Spalte Name mit Edit-Funktion
TableColumn<Member, String> memberColumn = new TableColumn<>("Name");
memberColumn.setMinWidth(150);
memberColumn.setCellValueFactory(new PropertyValueFactory<Member, String>("member"));
memberColumn.setCellFactory(TextFieldTableCell.forTableColumn());
memberColumn.setOnEditCommit(
new EventHandler<CellEditEvent<Member, String>>() {
@Override
public void handle(CellEditEvent<Member, String> t) {
((Member) t.getTableView().getItems().get(t.getTablePosition().getRow())).setMember(t.getNewValue());
}
}
);
// Spalte Ausgaben mit Edit-Funktion
TableColumn<Member, String> expensesColumn = new TableColumn<>("Ausgaben");
expensesColumn.setMinWidth(50);
expensesColumn.setCellValueFactory(new PropertyValueFactory<>("expenses"));
expensesColumn.setCellFactory(TextFieldTableCell.forTableColumn());
expensesColumn.setOnEditCommit(
new EventHandler<CellEditEvent<Member, String>>() {
@Override
public void handle(CellEditEvent<Member, String> t) {
((Member) t.getTableView().getItems().get(t.getTablePosition().getRow())).setExpenses(t.getNewValue());
//((Member) t.getTableView().getItems().get(t.getTablePosition().getRow())).setDifference(Double.parseDouble(t.getNewValue()));
}
}
);
// Spalte Pfand mit Edit-Funktion
TableColumn<Member, String> earningsColumn = new TableColumn<>("Pfand");
earningsColumn.setMinWidth(50);
earningsColumn.setCellValueFactory(new PropertyValueFactory<Member, String>("earnings"));
earningsColumn.setCellFactory(TextFieldTableCell.forTableColumn());
earningsColumn.setOnEditCommit(
new EventHandler<CellEditEvent<Member, String>>() {
@Override
public void handle(CellEditEvent<Member, String> t) {
((Member) t.getTableView().getItems().get(t.getTablePosition().getRow())).setEarnings(t.getNewValue());
}
}
);
//Spalte Differenz ohne Edit-Funktion
TableColumn<Member, Double> differenceColumn = new TableColumn<>("Differenz");
differenceColumn.setMinWidth(50);
differenceColumn.setCellValueFactory(new PropertyValueFactory<>("difference"));
//Editier-Leiste
TextField tfMember = new TextField();
tfMember.setMinWidth(150);
tfMember.setPromptText("Name");
TextField tfExpenses = new TextField();
tfExpenses.setMinWidth(50);
tfExpenses.setPromptText("Ausgaben");
TextField tfEarnings = new TextField();
tfEarnings.setMinWidth(50);
tfEarnings.setPromptText("Pfand");
Button btnAdd = new Button("Hinzufügen");
Button btnDelete = new Button("Löschen");
hboxTable.getChildren().addAll(tfMember, tfExpenses, tfEarnings, btnAdd, btnDelete);
// Spalten der Tabelle hinzufügen und Tabelle editierbar machen
table.getColumns().addAll(memberColumn, expensesColumn, earningsColumn, differenceColumn);
table.setEditable(true);
// table.setItems(data);
btnAdd.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
try {
Member member = new Member();
member.setMember(tfMember.getText());
member.setExpenses(tfExpenses.getText());
member.setEarnings(tfEarnings.getText());
member.setDifference(Double.parseDouble(tfExpenses.getText()) - Double.parseDouble(tfEarnings.getText()));
table.getItems().add(member);
//data.add(member);
tfMember.clear();
tfExpenses.clear();
tfEarnings.clear();
} catch (NumberFormatException Exception) {}
}
});
//Elemente dem Gridpane hinzufügen und Rest
primarygridpane.add(titel, 0, 0, 2, 1);
primarygridpane.add(table, 0, 2);
primarygridpane.add(hboxTable, 0, 3);
Scene scene = new Scene(primarygridpane,450,550);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {e.printStackTrace();}
}
public static void main(String[] args) {
launch(args);
}
}
package application;
import javafx.beans.binding.DoubleBinding;
import javafx.beans.binding.NumberBinding;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class Member {
private SimpleStringProperty member = new SimpleStringProperty();
private DoubleProperty expenses = new SimpleDoubleProperty();
private DoubleProperty earnings = new SimpleDoubleProperty();
private DoubleProperty difference = new SimpleDoubleProperty();
public Member(String member, Double expenses, Double earnings) {
this.member = new SimpleStringProperty(member);
this.expenses = new SimpleDoubleProperty(expenses);
this.earnings = new SimpleDoubleProperty(earnings);
// NumberBinding nb = earningsProperty().subtract(expensesProperty());
// this.difference = new SimpleDoubleProperty(nb);
// NumberBinding nb2 = expenses.subtract(earnings);
}
public String getMember() {
return member.get();
}
public void setMember(String name) {
member.set(name);
}
public final StringProperty MemberProperty(){
return member;
}
public Double getExpenses() {
return expenses.get();
}
public void setExpenses(Double value) {
expenses.set(value);
}
public final DoubleProperty expensesProperty(){
return expenses;
}
public Double getEarnings() {
return earnings.get();
}
public void setEarnings(Double value) {
earnings.set(value);
}
public final DoubleProperty earningsProperty(){
return earnings;
}
public Double getDifference() {
return difference.get();
}
public void setDifference(Double value) {
difference.set(value);
}
public final DoubleProperty differenceProperty(){
return difference;
}
}
I would be very thankfull if someone could help me :)