【发布时间】:2018-01-16 08:48:32
【问题描述】:
我是 JavaFX 的新手,我想知道用这种语言开发 MVC 数据库应用程序的最佳实践是什么,如果您是高级开发人员,我想我的问题会很简单。
让我们考虑一个用 JavaFX 开发的基本应用程序的简单示例:与 SQL 数据库链接的 ToDoList。
- 数据库只是一个具有 id 和 taskDescr VARCHAR 字段的表 Task。
- 目的很简单:我们只想在 TableView 或 ListView 中显示任务并能够添加一些任务。
这就是我们的应用程序的样子:
我决定把我的代码分成四部分,DAO代表表中数据的类(Task.java),访问数据库的DAO类(它的行为在这里无关紧要) )。 model 代表我们 TodoList 的 Model 部分(包含任务列表并对其执行操作,调用 DAO 等)。 FXML Views 和 Controller :
接下来,你可以找到我们感兴趣的不同类的代码(我们假设 DAO 是好的(自动设置 id)并且我们不处理错误情况以简化代码:
Task.java
public class Task {
private int id;
private SimpleStringProperty task;
public Task(int i, String s){
this.id = i;
this.task = new SimpleStringProperty(s);
}
public void setId(int i){
this.id = i;
}
public int getId() {
return id;
}
public String getTask() {
return task.get();
}
public void setTask(String task) {
this.task.set(task);
}
@Override
public boolean equals(Object o){
if(this.id == ((Task)o).id)
return true;
return false;
}
}
ToDoListModel.java
public class ToDoListModel {
private List<Task> taskList;
private DAO dao;
public ToDoListModel(){
this.taskList = new ArrayList<Task>();
this.dao = new DAO();
}
public void loadDatabase(){
this.taskList = this.dao.getAllTasks();
}
public void addTask(Task t){
// Operations throwing Exceptions such as : Does the task t is already in the list, etc...
this.taskList.add(t);
this.dao.createTask(t);
}
public void deleteTask(Task t){
this.taskList.remove(t);
this.dao.deleteTask(t);
}
public List<Task> getTaskList() {
return taskList;
}
}
Controller.java
public class Controller {
private final ToDoListModel model;
@FXML
private TableView<Task> taskTable;
@FXML
private TableColumn<Task, String> taskColumn;
@FXML
private TextField taskTextField;
public Controller(ToDoListModel m){
this.model = m;
}
@FXML
protected void initialize() {
this.model.loadDatabase();
// Setting up data table
taskColumn.setCellValueFactory(new PropertyValueFactory<Task, String>("task"));
ObservableList<Task> taskObservableList = FXCollections.observableList(this.model.getTaskList());
taskTable.setItems(taskObservableList);
}
@FXML
public void handleAddButton(ActionEvent e) {
Task t = new Task(-1, this.taskTextField.getText());
// What operations to do here ?
this.model.addTask(t);
this.taskTable.getItems().add(t);
this.taskTable.refresh();
}
}
Main.java
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
ToDoListModel model = new ToDoListModel();
primaryStage.setTitle("My Todo");
FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("views/View.fxml"));
loader.setController(new Controller(model));
Parent root = loader.load();
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
最后,我的问题是:我的方法好吗?我的意思是我已经创建了一个带有任务列表的 ToDoListModel,事实上我在使用 DAO 更新我的数据库的同一任务中更新了我的对象列表Task(在DAO 将在列表中添加后执行),最重要的是:我应该在 Controller 的 handleAddButton 中执行哪些操作?在这里,我首先在我的 TodoListModel 中使用了 add 方法,但这还不够,因为我的可观察列表被错误地更新了(添加的任务出现了,但我们无法用鼠标选择它)。然后,当我在 TableView 项目中也添加它时,任务出现两次,并且在列表中被添加了两次。
因此,我了解到 ObservableList 已链接到我的 ToDoListModel 中的列表,但是如果我只想在我的模型中对该列表进行操作但正确更新 ObservableList,我应该怎么做? (可选项目等...)
提前感谢您的帮助和耐心等待, 真挚地, 保罗
【问题讨论】:
-
没有错误处理的逻辑。在 UI 线程中使用数据库并不好。
ToDoListModel与ObservableList配合得很好,不需要保留它的实例(她坐在控件中)。 -
handleAddButton可以使用ToDoListModel立即将元素保存在数据库中,但是在进行小的更改时这很有用。当您进行更多编辑时,最好制作一个单独的保存按钮,该按钮仅允许向数据库发出一个请求 (upsert) 来保存整个列表,并允许一个delete删除。 -
嗨,是的,正如我所说,我没有编写错误处理代码只是为了简化此处发布的代码。好的,所以我必须用 ObservableList
替换 TaskListModel 中的 List 并对其进行操作?我想我不明白你的第二个帖子:/
标签: java database model-view-controller javafx fxml