mvvmFX在已实现的ViewModel的ViewTuple中引发不兼容的类型

时间:2017-09-08 11:10:21

标签: java javafx javafx-8 mvvmfx

我已经创建了一个示例项目,如getting started documentation of mvvmFX所示。我的MainViewModel按预期实施de.saxsys.mvvmfx.ViewModel。除了类名之外,内容与文档中的内容相同。

奇怪的是,ViewTuple方法中的start不接受MainViewModel兼容。

Error:(28, 102) java: incompatible types: de.saxsys.mvvmfx.ViewTuple<com.erayerdin.imageviewer.views.MainView,de.saxsys.mvvmfx.ViewModel> cannot be converted to de.saxsys.mvvmfx.ViewTuple<com.erayerdin.imageviewer.views.MainView,com.erayerdin.imageviewer.viewmodels.MainViewModel>

那么,为什么MainViewModel实施de.saxsys.mvvmfx.ViewModelViewTuple不兼容?

代码

App.java

package com.erayerdin.imageviewer;

import com.erayerdin.imageviewer.viewmodels.MainViewModel;
import com.erayerdin.imageviewer.views.MainView;
import de.saxsys.mvvmfx.FluentViewLoader;
import de.saxsys.mvvmfx.ViewTuple;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.util.List;

public class App extends Application {
    public static List<String> PARAMS;

    public static void main( String[] args ) {
        launch(args);
    }

    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Reian ImageViewer");

        ViewTuple<MainView, MainViewModel> viewTuple = FluentViewLoader.fxmlView(MainView.class).load();
        Parent root = viewTuple.getView();
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

MainView.java

package com.erayerdin.imageviewer.views;

import com.erayerdin.imageviewer.viewmodels.MainViewModel;
import de.saxsys.mvvmfx.FxmlView;
import de.saxsys.mvvmfx.InjectViewModel;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

import java.net.URL;
import java.util.ResourceBundle;

public class MainView implements FxmlView<MainViewModel>, Initializable {
    @FXML private Label helloLabel;

    @InjectViewModel
    MainViewModel controller;

    public void initialize(URL location, ResourceBundle resources) {
        helloLabel.textProperty().bind(controller.helloMessageProperty());
    }
}

MainViewModel.java

package com.erayerdin.imageviewer.viewmodels;

import de.saxsys.mvvmfx.ViewModel;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class MainViewModel implements ViewModel {
    private StringProperty helloMessage = new SimpleStringProperty("Hello World!");

    public String getHelloMessage() {
        return helloMessage.get();
    }

    public StringProperty helloMessageProperty() {
        return helloMessage;
    }

    public void setHelloMessage(String helloMessage) {
        this.helloMessage.set(helloMessage);
    }
}

环境

  • Java 1.8.0_144
  • JavaFX 8.0.141
  • mvvmFX 1.6.0

1 个答案:

答案 0 :(得分:1)

此问题很可能是由于Java版本错误造成的。即使您使用的是Java 8,我也假设您的IDE / Build系统配置了较旧的Java版本。

以前的java版本中无法使用FluentViewLoader中使用的类型推断。

我已经使用标准maven项目测试了你的类并得到了相同的错误,因为maven默认使用Java 1.5(据我所知)。然后我更改了maven设置,以便编译器使用1.8版作为源和目标版本,如下所示:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

使用此设置,它按预期工作。