【问题标题】:Java updating Table view cell values from another classJava 从另一个类更新表视图单元格值
【发布时间】:2018-08-25 09:57:40
【问题描述】:

我正在尝试从另一个类更改我的一个列及其单元格值,但是当 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();
}

当我想更新表格列时,此类工作正常,如果我单击停止任务方法(链接到按钮),状态列将更新为我想要执行的停止标签,与启动任务方法相同.

我要更新表格视图状态列的随机类:

public class UpdateTable {
public static void main(String[] args) {
    OverviewController.getOverviewController.returnStatusColumn.setCellValueFactory(
    cellData -> cellData.getValue().getStatusProperty());
    OverviewController.getOverviewController().returnTasks().refresh();
    }

}

TableView 数据:

//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 -&gt; cellData.getValue().getStatusProperty());

我这样做完全错误吗?我只是希望能够更新来自不同类的表格​​视图列单元格。

【问题讨论】:

  • 一般规则:如果您似乎需要静态字段,那么您总是做错事(如 99.999999%)

标签: java javafx java-8


【解决方案1】:

是的,你这样做是错误的。

您不要在任何需要用作应用程序入口点的地方使用Application 子类(假设您没有使用JFXPanelPlatform.startup)。此外,您将列作为程序中的第一条语句访问,这意味着无法初始化 statusColumn 字段。

通常不需要涉及任何类,但用于初始化cellValueFactory 的控制器类除外。尤其是使用static 字段是一种不好的方法:

假设您在 fxml 中指定控制器类,FXMLLoader 会创建控制器类的新实例。此实例与存储在controller 字段中的实例不同,因此即使在使用时

OverviewController.getOverviewController.returnStatusColumn.setCellValueFactory(
    cellData -> cellData.getValue().getStatusProperty());

加载 fxml 后,您将无法获得所需的实例。

相反,我建议使用控制器类的initialize 方法进行此类初始化。它由FXMLLoader在创建并注入fxml中指定的所有对象后调用。

public class OverviewController {

    ...

    @FXML
    private TableColumn<Task, String> statusColumn;

    ...

    @FXML
    private void initialize() {
        statusColumn.setCellValueFactory(cellData -> cellData.getValue().getStatusProperty());
    }

}

如果您确实需要从非控制器类传递一些信息,请参阅Passing Parameters JavaFX FXML 此处的答案。答案中描述了比使用 static 更好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多