【问题标题】:How do I share a Observablelist between 2 controllers , I have tried various methods but I get null pointer exceptions如何在 2 个控制器之间共享 Observablelist,我尝试了各种方法,但我得到空指针异常
【发布时间】:2016-12-17 13:51:26
【问题描述】:

我对编码完全陌生,并且被一些“绑定”代码所困扰。我有一个带有 getter 和 setter 的 Record 类,以及一个 Records Observable 列表,它们一起在一个名为 RecordController 的控制器中填充一个 Tableview。我想在一个单独的 AdminController 文件上填充另一个 tableview,它们都具有不同的视图 fxml。

如何在我的 Record.java 类中绑定 SimpleStringProperties,这样当它们通过 RecordContoller 中的 set 方法(通过任何 UI 用户交互)更新时,AdminController 中的(editatble)Tableview 被填充使用新值。

部分代码.....

public class Record {

private final SimpleStringProperty stationName;
private final SimpleStringProperty staffName;
private final SimpleStringProperty staffNumber;
private final SimpleStringProperty agencyName;
private final SimpleStringProperty aircraftType;
private final SimpleStringProperty issueDate;
private final SimpleStringProperty validTill;


public Record(String stationName, String staffName,
        String staffNumber, String agencyName, String aircraftType,
        String issueDate, String validTill) {
    this.stationName = new SimpleStringProperty(stationName);
    this.staffName = new SimpleStringProperty(staffName);
    this.staffNumber = new SimpleStringProperty(staffNumber);
    this.aircraftType = new SimpleStringProperty(aircraftType);
    this.agencyName = new SimpleStringProperty(agencyName);
    this.issueDate = new SimpleStringProperty(issueDate);
    this.validTill = new SimpleStringProperty(validTill);

}

public String getStationName() {

    return stationName.getValue();
}

public String getStaffName() {
    return staffName.getValue();
}

public String getStaffNumber() {
    return staffNumber.getValue();
}

public String getAgencyName() {
    return agencyName.getValue();
}

public String getAircraftType() {
    return aircraftType.getValue();
}

public String getIssueDate() {
    return issueDate.getValue();
}

public String getValidTill() {
    return validTill.getValue();
}

}

还有带有第一个 Tableview 的 RecordController .....

columnStation.setCellValueFactory(new PropertyValueFactory<>("stationName"));
    columnStaffName.setCellValueFactory(new PropertyValueFactory<>("staffName"));
    columnStaffNumber.setCellValueFactory(new PropertyValueFactory<>("staffNumber"));
    columnAgency.setCellValueFactory(new PropertyValueFactory<>("agencyName"));
    columnAircraftType.setCellValueFactory(new PropertyValueFactory<>("aircraftType"));
    columnIssueDate.setCellValueFactory(new PropertyValueFactory<>("issueDate"));
    columnValidTill.setCellValueFactory(new PropertyValueFactory<>("validTill"));


    recordTableView.setItems(null);
    recordTableView.setItems(records);

记录可观察列表是.....

private ObservableList<Record> records=FXCollections.observableArrayList();

另一个 fxml 的 adminController 也有另一个 tableview,我想用 Record.java 中的属性变量(类/bean?)以某种方式填充它。

【问题讨论】:

    标签: javafx properties binding tableview


    【解决方案1】:

    从 -1 中恢复我收到的问题...

    万一有一个新手偶然发现了这个问题。答案就在下面的帖子中。

    Passing Parameters JavaFX FXML

    【讨论】:

      【解决方案2】:

      如果您使用JavaFX properties pattern,那么对Record 实例中属性的更改将自动反映在表格视图中。所以你的Record 类应该是这样的

      public class Record {
      
          private final StringProperty stationName;
          private final StringProperty staffName;
          private final StringProperty staffNumber;
          private final StringProperty agencyName;
          private final StringProperty aircraftType;
          private final StringProperty issueDate;
          private final StringProperty validTill;
      
      
          public Record(String stationName, String staffName,
                  String staffNumber, String agencyName, String aircraftType,
                  String issueDate, String validTill) {
              this.stationName = new SimpleStringProperty(stationName);
              this.staffName = new SimpleStringProperty(staffName);
              this.staffNumber = new SimpleStringProperty(staffNumber);
              this.aircraftType = new SimpleStringProperty(aircraftType);
              this.agencyName = new SimpleStringProperty(agencyName);
              this.issueDate = new SimpleStringProperty(issueDate);
              this.validTill = new SimpleStringProperty(validTill);
      
          }
      
          public StringProperty stationNameProperty() {
              return stationName ;
          }
      
          public final String getStationName() {
              return stationNameProperty().get();
          }
      
          public final void setStationName(String stationName) {
              stationNameProperty().set(stationName);
          }
      
          // similarly for other properties...
      
      }
      

      请注意,许多 IDE(例如 Netbeans 或带有 E(fx)clipse 插件的 Eclipse)将为您生成这些方法。

      现在,只要您更改表的项目列表中相同的 Record 对象,对这些 Records 的更改将自动导致表中的更改:不需要额外的绑定。

      【讨论】:

      • 感谢 James 的回复,对不起,我应该澄清一下,一个 fxml 中的 Tableview(查看记录)已经在更新,没有任何问题。我有一个关于该视图的记录的搜索表。问题是,我有另一个 fxml(管理视图),它有一个表,每当记录中的变量发生变化时,我也希望更新该表。
      • @supernova.surfer 所以这不是很清楚......如果你可以让它工作一次,你大概可以让它再次工作。您可能应该更新您的问题,使其包含minimal reproducible example(将表和记录类减少到一或两列,并包括两个 fxml 文件,同样最小化和控制器)
      • 基本上记录视图(通过其控制器)从一些 mySQL 查询中设置记录变量。管理视图(通过其控制器)也有一个表格视图,我想用相同的变量对其进行更新。我不确定我该怎么做。
      • 好吧,詹姆斯,我会按照你的建议去做
      • 只是一个尝试理解的问题......如果我有 2 个 Tableviews,每个有 2 个控制器类文件,我如何使用上面的“记录”Observable 列表以便它可以更新两个 Tableviews。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 2021-10-07
      相关资源
      最近更新 更多