我如何使用同一对象调用 class 之外的方法
How do i call a method outside a class with the same object
我有一个由 BorderPane 扩展的 Classe FoodManagerPane。在此 class 中,我使用不同的 class 组件构建我的窗格。例如,我有一个 class MenuBar,我在这个 FoodManagerPane 中初始化它并插入到窗格中。
FoodManagerPane 扩展 BorderPane
public class FoodManagerPane extends BorderPane {
private MenuBarView menuBarView = new MenuBarView();
private Button buttonDelete = null;
...
private Button getButtonDelete() {
if (buttonDelete == null) {
buttonDelete = new Button("Delete");
buttonDelete.setOnAction(deleteEvent);
}
return buttonDelete;
}
public void refreshData() {
this.getFoodTableView().setItems(DataHandler.INSTANCE.foodlist());
}
}
DataHandler.INSTANCE.foodlist() returns 列表的当前条目
在这个 class 中,除其他外,我还有方法 refreshData(),它将 ObservableList 中的数据与视图同步。
我还创建了一个按钮来从我的列表中删除对象。我在单独的 class.
中为此定义了 ActionEvent
DeleteButton 的 ActionEvent
public class DeleteFoodEventHandler implements EventHandler<ActionEvent> {
private final FoodTableView foodTableView = new FoodTableView();
@Override
public void handle(ActionEvent event) {
//do something
foodTableView.setItems(DataHandler.INSTANCE.foodlist());
}
}
}
所以在我的 ActionEvent class 中我定义了元素应该从列表中删除(有效)但是我想直接更新 table,不幸的是它在这里不起作用。
如果我直接在 FoodManagerPane 中定义 ActionHandler 并在此处调用方法 refreshData(),它就可以工作。但我想将活动外包。这里有人有想法吗?
更新:
DataHandler-Class
public enum DataHandler {
INSTANCE;
private boolean update;
private List<Food> foodlist = null;
DataHandler() {
getFoodlist();
}
public ObservableList<Food> foodlist() {
return FXCollections.observableArrayList(getFoodlist());
}
private List<Food> getFoodlist() {
if (foodlist == null) {
foodlist = new ArrayList<>();
}
System.out.println("The List: " + foodlist);
return foodlist;
}
public void createFood(Food food) {
System.out.println("createFood()");
this.foodlist.add(food);
update = true;
}
public void deleteFood(Food food) {
System.out.println("deleteFood()");
this.foodlist.remove(food);
update = true;
}
public void deleteFoodlist(List<Food> foodlist) {
System.out.println("deleteFoodlist()");
for (Food food : foodlist) {
deleteFood(food);
}
}
如果有人遇到类似问题,这是解决方案。非常感谢 @kendavidson
public class AddFoodEventHandler {
public void addFood(TableView tableView) {
try {
//do something
} else {
// do more
// refresh the tableView
tableView.setItems(DataHandler.INSTANCE.foodlist());
}
}
}
}
我有一个由 BorderPane 扩展的 Classe FoodManagerPane。在此 class 中,我使用不同的 class 组件构建我的窗格。例如,我有一个 class MenuBar,我在这个 FoodManagerPane 中初始化它并插入到窗格中。
FoodManagerPane 扩展 BorderPane
public class FoodManagerPane extends BorderPane {
private MenuBarView menuBarView = new MenuBarView();
private Button buttonDelete = null;
...
private Button getButtonDelete() {
if (buttonDelete == null) {
buttonDelete = new Button("Delete");
buttonDelete.setOnAction(deleteEvent);
}
return buttonDelete;
}
public void refreshData() {
this.getFoodTableView().setItems(DataHandler.INSTANCE.foodlist());
}
}
DataHandler.INSTANCE.foodlist() returns 列表的当前条目
在这个 class 中,除其他外,我还有方法 refreshData(),它将 ObservableList 中的数据与视图同步。
我还创建了一个按钮来从我的列表中删除对象。我在单独的 class.
中为此定义了 ActionEventDeleteButton 的 ActionEvent
public class DeleteFoodEventHandler implements EventHandler<ActionEvent> {
private final FoodTableView foodTableView = new FoodTableView();
@Override
public void handle(ActionEvent event) {
//do something
foodTableView.setItems(DataHandler.INSTANCE.foodlist());
}
}
}
所以在我的 ActionEvent class 中我定义了元素应该从列表中删除(有效)但是我想直接更新 table,不幸的是它在这里不起作用。
如果我直接在 FoodManagerPane 中定义 ActionHandler 并在此处调用方法 refreshData(),它就可以工作。但我想将活动外包。这里有人有想法吗?
更新: DataHandler-Class
public enum DataHandler {
INSTANCE;
private boolean update;
private List<Food> foodlist = null;
DataHandler() {
getFoodlist();
}
public ObservableList<Food> foodlist() {
return FXCollections.observableArrayList(getFoodlist());
}
private List<Food> getFoodlist() {
if (foodlist == null) {
foodlist = new ArrayList<>();
}
System.out.println("The List: " + foodlist);
return foodlist;
}
public void createFood(Food food) {
System.out.println("createFood()");
this.foodlist.add(food);
update = true;
}
public void deleteFood(Food food) {
System.out.println("deleteFood()");
this.foodlist.remove(food);
update = true;
}
public void deleteFoodlist(List<Food> foodlist) {
System.out.println("deleteFoodlist()");
for (Food food : foodlist) {
deleteFood(food);
}
}
如果有人遇到类似问题,这是解决方案。非常感谢 @kendavidson
public class AddFoodEventHandler {
public void addFood(TableView tableView) {
try {
//do something
} else {
// do more
// refresh the tableView
tableView.setItems(DataHandler.INSTANCE.foodlist());
}
}
}
}