조직의 월별 월급을 포함하는 javafx 테이블이 있습니다. 이 표에서 기본 금액으로 일부 금액을 표시하여 사용자가 금액을 업데이트하거나 다른 방법으로 진행할 수 있도록합니다. 실제로 필요한 것은 사용자가 모든 값을 업데이트하면 테이블 observablelist에 즉시 바인드해야합니다.Javafx 테이블 뷰 바인딩이 cellValueFactory 내부에서 테이블 observablelist로 변경됩니다.
만들기 테이블 :
private void initCollectionTable(ObservableList<Member> mList) {
...
total_pay_col.setCellValueFactory(new SubscriptionValueFactory());
detail_view_col.setCellValueFactory(new DisplaySubscriptionFactory());
...
collection_tbl.setItems(mlz);
}
SubscriptionValueFactory 등급 :
public class SubscriptionValueFactory implements Callback<TableColumn.CellDataFeatures<Member, String>, ObservableValue<String>> {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Member, String> param) {
//Here Subscriptions are equal to various member charges
Member ml = param.getValue();
List<MemberSubscriptions> mbrSubs = new ArrayList<>(ml.getMemberSubscriptions());
double sum =mbrSubs.stream().mapToDouble(a -> a.getAmount()).sum();
return new SimpleObjectProperty<>(TextFormatHandler.CURRENCY_DECIMAL_FORMAT.format(sum));
}
}
DisplaySubscriptionFactory 클래스
public class DisplaySubscriptionFactory implements Callback<TableColumn.CellDataFeatures<Member, Button>, ObservableValue<Button>> {
@Override
public ObservableValue<Button> call(TableColumn.CellDataFeatures<Member, Button> param) {
Member ml = param.getValue();
List<MemberSubscriptions> mbrSubs = new ArrayList<>(ml.getMemberSubscriptions());
double sum =mbrSubs.stream().mapToDouble(a -> a.getAmount()).sum();
boolean flag = // SOME BOOLEAN CHECK HERE-----
param.getValue().setTotalSubscription(sum);
Button button = new Button("View Info");
button.setOnAction((evt) -> {
Alert alert_details = new Alert(Alert.AlertType.INFORMATION);
alert_details.setTitle("Subscription Information");
alert_details.setHeaderText("Member Subscription information for each installment");
alert_details.getDialogPane().setContent(createContentGrid(mbrSubs, sum, flag));
alert_details.show();
});
return new SimpleObjectProperty<>(button);
}
이 방법은 텍스트 필드 내에 회원 요금을 표시하는 격자를 만듭니다. 따라서 텍스트 필드 내에서 값이 변경되면 테이블 observablelist의 자체 속성을 업데이트해야합니다.
private Node createContentGrid(List<MemberSubscriptions> mbrSubs, double sum, boolean flag) {
GridPane grid = new GridPane();
grid.setHgap(20);
grid.setVgap(10);
grid.setPadding(new Insets(20, 20, 10, 10));
Label totLabel = new Label(TextFormatHandler.CURRENCY_DECIMAL_FORMAT.format(sum));
totLabel.setFont(Font.font("System Bold", 21.0));
Label col_h_1 = new Label("Subscription");
col_h_1.setFont(Font.font("System Bold", 17.0));
Label col_h_2 = new Label("Amount");
col_h_2.setFont(Font.font("System Bold", 17.0));
grid.add(col_h_1, 0, 0);
grid.add(col_h_2, 1, 0);
Label[] labels = new Label[mbrSubs.size()];
TextField[] fields = new TextField[mbrSubs.size()];
for (int i = 0; i < mbrSubs.size(); i++) {
MemberSubscriptions get = mbrSubs.get(i);
labels[i] = new Label("label");
fields[i] = new TextField();
fields[i].setTextFormatter(TextFormatHandler.currencyFormatter());
labels[i].setText(get.getMemberSubscription().getFeeName());
fields[i].setText(TextFormatHandler.CURRENCY_DECIMAL_FORMAT.format(get.getAmount()));
grid.add(labels[i], 0, i + 1);
grid.add(fields[i], 1, i + 1);
}
grid.add(totLabel, 1, mbrSubs.size() + 1);
return grid;
}
회원 등급 :
public class Member {
private Integer id;
private String memberId;
...
private Set<MemberSubscriptions> memberSubscriptions = new HashSet<>();
...
MemberSubscriptions 클래스
public class MemberSubscriptions {
private Integer id;
private Member member;
private Double amount;
...
가능한 경우,'membersSubscriptions'는'ObservableSet'이어야하고'MemberSubscription'의 속성은 JavaFX- 스타일 observables/properties 여야합니다. 또한 왜 'MemberSubscription' 필드가있는'MembersSubscriptions' 클래스가 필요한지 이해하지 못합니다.'MemberSubscription' 필드가 아닌 ...'MemberS'의 세트가 실제 구독이 아니어야합니다. – Itai
첫째,'initCollectionTable()'은'mList'를 전달하지만, 어떻게 든'setItems()'는 아무 데서도 오는'mlz'를 사용합니다.둘째,'setCellValueFactory()'내부에 버튼을 생성해서는 안되며'setCellFactory()'에 있어야합니다. 셋째, 'Member' 및'MemberSubscriptions' 클래스에서 'IntegerProperty'와 같은 속성을 사용해야합니다. 넷째,'FXCollections.observableArrayList (Callback extractor)'로 인스턴스화 된 ObservableList를 사용해야합니다. –
Jai
@sillyfly 실수로 죄송합니다 ... MemberSubscriptions 클래스를 업데이트했습니다. –