我试图从另一个类更改我的列之一及其单元格值,但是当 java 尝试执行该行时,我不断收到空指针异常 OverviewController.getOverviewController.returnStatusColumn.setCellValueFactory(
cellData -> cellData.getValue().getStatusProperty());
,我已删除所有不敬的代码
TableView类:
@FXML
private TableView<Task> taskTable;
@FXML
private TableColumn<Task, String> statusColumn;
private final static OverviewController controller = new OverviewController
();
public static OverviewController getOverviewController() {
return controller;
}
public void setMainApp(MainApp mainApp) {
this.mainApp = mainApp;
taskTable.setItems(mainApp.getTaskData());
taskTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
taskTable.setPlaceholder(new Label(""));
}
public TableView<taskTable> returnTasks() {
return taskTable;
}
public TableColumn<taskTable, String> returnStatusColumn() {
return statusColumn;
}
@Override
public void initialize(URL location, ResourceBundle resources) {
statusColumn.setCellValueFactory(cellData ->
cellData.getValue().getStatusProperty());
}
@FXML
public void createTask(ActionEvent event) throws InterruptedException,
IOException, ParseException {
thread = new MyThread();
thread.main(null);
statusColumn.setCellValueFactory(cellData ->
cellData.getValue().getStatusRunningProperty());
statusColumn.setStyle("-fx-text-fill: green; -fx-font-weight: bold;");
taskTable.refresh();
}
@FXML
public void stopTasks() {
statusColumn.setCellValueFactory(cellData ->
cellData.getValue().getStatusProperty());
statusColumn.setStyle("-fx-text-fill: red; -fx-font-weight: bold;");
taskTable.refresh();
}
当我想更新表列时,该类工作正常,如果我单击停止任务方法(链接到按钮),状态列将更新为我想要执行的停止标签,与启动任务方法相同.
我想要更新 TableView 状态列的随机类:
public class UpdateTable {
public static void main(String[] args) {
OverviewController.getOverviewController.returnStatusColumn.setCellValueFactory(
cellData -> cellData.getValue().getStatusProperty());
OverviewController.getOverviewController().returnTasks().refresh();
}
}
表格 View 数据:
//Status Information
private final SimpleStringProperty status;
private final SimpleStringProperty statusRunning;
public Task() {
this(null, null);
}
public Task() {
this.statusRunning = new SimpleStringProperty("Running");
this.status= new SimpleStringProperty("Stop");
}
public StringProperty getStatusProperty( ) {
return status;
}
public StringProperty getStatusRunningProperty( ) {
return statusRunning;
}
}
如果我运行随机类,它将导致空指针异常,特别是这一行:
OverviewController.getOverviewController().returnStatusColumn().setCellValueFactory(cellData -> cellData.getValue().getStatusProperty());
我这样做完全是错误的吗?我只是希望能够更新不同类的 TableView 列单元格。
最佳答案
是的,你的做法是错误的。
您不要在需要用作应用程序入口点的任何地方使用 Application
子类(假设您没有使用 JFXPanel
或 Platform .startup
)。此外,您将该列作为程序中的第一条语句进行访问,这意味着 statusColumn
字段无法初始化。
此外,通常不需要涉及任何类,但需要涉及 Controller 类来初始化 cellValueFactory
。特别是使用static
字段是一个糟糕的方法:
假设您在 fxml 中指定 Controller 类,FXMLLoader
将创建 Controller 类的新实例。该实例与 controller
字段中存储的实例不同,因此即使使用
OverviewController.getOverviewController.returnStatusColumn.setCellValueFactory(
cellData -> cellData.getValue().getStatusProperty());
加载 fxml 后,您将无法获得所需的实例。
相反,我建议使用 Controller 类的 initialize
方法进行此类初始化。创建并注入(inject) fxml 中指定的所有对象后,它由 FXMLLoader
调用。
public class OverviewController {
...
@FXML
private TableColumn<Task, String> statusColumn;
...
@FXML
private void initialize() {
statusColumn.setCellValueFactory(cellData -> cellData.getValue().getStatusProperty());
}
}
<小时/>
如果您确实需要从非 Controller 的类传递一些信息,请参阅此处的答案 Passing Parameters JavaFX FXML 。答案中描述了比使用static
更好的方法。
关于Java 从另一个类更新 TableView 单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52016092/