【发布时间】:2016-01-31 20:58:48
【问题描述】:
我正在创建简单的 JavaFX 应用程序。我希望我的模型层完全独立于 JavaFX - 没有 StringProperty、IntegerProperty 等作为字段。我希望它是 POJO。这样做的主要原因是我希望它是可序列化的。
我创建了DataRepository - 简单的类似 CRUD 的接口和它的一些实现,所以我可以随时更改存储数据的位置 - XML 文件、SQLite 数据库或其他任何东西。我还必须以某种方式将我的数据存储与 JavaFX 连接起来(以在 TableView 中显示其内容),因此我决定创建我的 ObservableList 实现,它包装了我的存储库。我的问题是 - 还有其他方法吗? ObservableList 包含大约 30 个实现方法,看起来我做错了什么。
我的(简化的)模型:
public class Movie implements Serializable {
private String title;
private String director;
public Movie() {
}
public Movie(String title, String director) {
this.title = title;
this.director = director;
}
// Getters and setters, equals etc...
}
电影存储库:
public interface MovieRepository {
public void add(Movie movie);
public void remove(String title);
public void remove(int index);
public Movie get(String title);
public Movie get(int index);
public List<Movie> getAll();
}
主视图的控制器:
public class MainController {
@FXML
private TableView<Movie> movieTable;
@FXML
private TableColumn<Movie, String> movieTitleColumn;
@FXML
private Label titleLabel;
private MovieRepository movies = new DBMovieRepository(); //MovieRepository implementation which uses SQLite DB to store data
private MainApp app;
@FXML
private void initialize() {
movieTable.setItems(new ObservableMovies(movies));
// ObservableMovies is my implementation of ObservableList
// It basically wraps methods from MovieRepository
// and notifies listeners
showMovieDetails(null);
movieTitleColumn.setCellValueFactory(cellData -> new ReadOnlyStringWrapper(cellData.getValue().getTitle()));
movieTable.getSelectionModel().selectedItemProperty()
.addListener((observable, oldValue, newValue) -> showMovieDetails(newValue));
}
private void showMovieDetails(Movie movie) {
if(movie != null) {
titleLabel.setText(movie.getTitle());
} else {
titleLabel.setText("");
}
}
@FXML
private void handleNew() {
Movie movie = new Movie();
app.showNewMovieDialog(movie);
movieTable.getItems().add(movie);
}
public void setApp(MainApp app) {
this.app = app;
}
}
【问题讨论】:
-
为什么不将您的属性标记为
transient?然后你只需要将它们包装在你的值周围,它将是 JavaFX 兼容和Serializable。我也不明白,为什么你要实现自己的ObversableList。FXCollections中有一些方法可以从普通的java.util.Collections创建那些。但是如果你真的需要实现它,你可以从ObservableListBase继承。