【问题标题】:Add a calculation column to observable list将计算列添加到可观察列表
【发布时间】:2023-03-13 18:16:01
【问题描述】:

我对 java 和 JavaFX Scene Builder 还很陌生。很难从 Scene builder with Java 中找到有关如何链接/编码表单的教程。所以我最终对它提出了一个问题。

我有一个包含 2 列的可观察列表。 A 列给我整数作为字符串 B 列另一个整数作为字符串 - 我现在如何计算列 C (A - B)?

到目前为止,我将代码设置如下:

主控制器类

public class MainController implements Initializable {

    // Define table

    @FXML
    TableView<Table> tableID;
    @FXML
    TableColumn<Table, Integer> iA;
    @FXML
    TableColumn<Table, Integer> iB;
    @FXML
    TableColumn<Table, Integer> iC;

    // Define Form
    @FXML
    TextField AInput;
    @FXML
    TextField BInput;
    @FXML
    Button submit;


    // Define variables


    // create table data
    final ObservableList<Table> data = FXCollections.observableArrayList(
    );


    @Override
    public void initialize(URL location, ResourceBundle resources) {

        iC.setCellValueFactory(new PropertyValueFactory<Table, Integer>("rC"));
        iA.setCellValueFactory(new PropertyValueFactory<Table, Integer>("rA"));
        iB.setCellValueFactory(new PropertyValueFactory<Table, Integer>("rB"));

        tableID.setItems(data); 
    }

    public void onAddItem(ActionEvent event) {
        Table entry = new Table(Integer.parseInt
                (AInput.getText()), Integer.parseInt
                (BInput.getText()));

        // insert data in table
        data.add(entry);
    }

}
}

表格类

public class Table {

    private final SimpleIntegerProperty rA;
    private final SimpleIntegerProperty rB;

    public Table(Integer sA, Integer sB) {

        this.rA = new SimpleIntegerProperty(sA);
        this.rB = new SimpleIntegerProperty(sB);
    }

    public Integer getRA() {
        return rA.get();
    }

    public void setRA(Integer v) {
        rA.set(v);
    }
    public Integer getRB() {
        return rB.get();
    }

    public void setRB(Integer v) {
        rB.set(v);
    }
}

我需要为计算 rA - rB 的 c 设置另一个设置模式吗?

【问题讨论】:

    标签: java scenebuilder observablelist


    【解决方案1】:

    只需向您的 Table 类添加一个 getter 方法即可返回用于其他列的值之间的差异。

    public Integer getRC() { return getRA() - getRB(); }
    

    可执行样本

    import javafx.application.Application;
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.collections.F*;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.stage.Stage;
    
    public class SubtractingTable extends Application {
        public static class Table {
            private final SimpleIntegerProperty rA;
            private final SimpleIntegerProperty rB;
    
            public Table(Integer sA, Integer sB) {
                this.rA = new SimpleIntegerProperty(sA);
                this.rB = new SimpleIntegerProperty(sB);
            }
    
            public Integer getRA() {
                return rA.get();
            }
    
            public void setRA(Integer v) {
                rA.set(v);
            }
            public Integer getRB() {
                return rB.get();
            }
    
            public void setRB(Integer v) {
                rB.set(v);
            }
    
            public Integer getRC() { return getRA() - getRB(); }
        }
    
        @Override
        public void start(Stage stage) {
            TableView<Table> tableID = new TableView<>();
    
            TableColumn<Table, Integer> iC = new TableColumn<>("A - B");
            iC.setCellValueFactory(new PropertyValueFactory<>("rC"));
            iC.setStyle("-fx-alignment: baseline_right;");
    
            TableColumn<Table, Integer> iA = new TableColumn<>("A");
            iA.setCellValueFactory(new PropertyValueFactory<>("rA"));
            iA.setStyle("-fx-alignment: baseline_right;");
    
            TableColumn<Table, Integer> iB = new TableColumn<>("B");
            iB.setCellValueFactory(new PropertyValueFactory<>("rB"));
            iB.setStyle("-fx-alignment: baseline_right;");
    
            tableID.getColumns().addAll(iA, iB, iC);
    
            tableID.setItems(data);
            tableID.setPrefSize(150, 125);
    
            stage.setScene(new Scene(tableID));
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }    
    
        final ObservableList<Table> data = FXCollections.observableArrayList(
                new Table(5, 3),
                new Table(7, 4),
                new Table(9, 3)
        );
    }
    

    【讨论】:

    • 完美!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多