gpt4 book ai didi

java - 如何通过 Combobox 的 selectedItem 操作对象

转载 作者:行者123 更新时间:2023-12-01 09:41:39 25 4
gpt4 key购买 nike

万一有人想帮助我,我会非常感激,因为我是 java 菜鸟,试图学习简单的概念,同时保持代码干净且易于阅读。如果您认为这是一个愚蠢的问题,因为我的编码方法错误,我会非常关心您的意见,如果您向我解释为什么我会尝试获得您的经验。

现在的问题是:

我有一个 mainApp,其中包含可观察的人员列表和可观察的事件列表

public class MainApp extends Application {
private Stage primaryStage;
private BorderPane rootLayout;
private ObservableList<Evento> eventi = FXCollections.observableArrayList();
private ObservableList<Person> persons = FXCollections.observableArrayList();

public ObservableList<Evento> getEventi() {
return eventi;
}

public ObservableList<Person> getPersons() {
return persons;
}

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

public void start(Stage primaryStage){
this.primaryStage = primaryStage;
this.primaryStage.setTitle("Bettator Events");

Person test = new Person("Daniele", "Giaquinto");
test.getEventi().add(new Evento("danEvento", 1.0, "testConto"));
persons.add(test);
Person test2 = new Person("Roberto", "Sellitto");
test2.getEventi().add(new Evento("robEvento", 31.0, "testCo"));
persons.add(test2);

initRootLayout();
showEventiLayout();
}

Person 对象也有一个事件列表,我在之后创建了它,因为我试图创建一个响应式 GUI,所以在这种情况下,每个人都有自己的事件列表,而不是一个事件列表。

public class Person {
private StringProperty firstName;
private StringProperty lastName;
private StringProperty nickName;
private ObservableList<Evento> eventi = FXCollections.observableArrayList();

我在 EventyLayout 中创建了一个组合框和一个 TableView ,当我使用监听器更改组合框时, TableView 将填充该人员对象的事件列表,我这样做了,用所选人员填充了 mainApp 事件列表 Activity 列表

(事件 Controller )

public class EventiLayoutController {
private MainApp mainApp;

@FXML
private ComboBox<Person> utenteCmb;
@FXML
private TableView<Evento> eventiTbl;
@FXML
private TableColumn<Evento, String> eventoCol;
@FXML
private TableColumn<Evento, Double> importoCol;
@FXML
private TableColumn<Evento, String> contoCol;

@FXML
void initialize() {

eventoCol.setCellValueFactory(cellData -> cellData.getValue().nomeProperty());
importoCol.setCellValueFactory(cellData -> cellData.getValue().importoProperty().asObject());
contoCol.setCellValueFactory(cellData -> cellData.getValue().contoProperty());
utenteCmb.setCellFactory((comboBox) -> new ListCell<Person>() {
//cut for stackoverflow
});
utenteCmb.setConverter(new StringConverter<Person>() {
//cut for stackoverflow
});
utenteCmb.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
mainApp.getEventi().clear();
mainApp.getEventi().addAll(newValue.getEventi());
});
}

public void setMainApp(MainApp mainApp){
this.mainApp = mainApp;

eventiTbl.setItems(mainApp.getEventi());
utenteCmb.setItems(mainApp.getPersons());
}

}

在项目无法切换用户之前,我创建了一个“handleAddEvent”来将事件添加到 rootLayoutController 的 mainApp 列表中(向我显示菜单栏和菜单项,其中添加按钮所在的那个)

public class RootLayoutController {

private MainApp mainApp;

@FXML // ResourceBundle that was given to the FXMLLoader
private ResourceBundle resources;

@FXML // URL location of the FXML file that was given to the FXMLLoader
private URL location;

@FXML // This method is called by the FXMLLoader when initialization is complete
void initialize() {

}

/**
* Needed for pass the MainApp to this controller ad use the public variable
*/
public void setMainApp(MainApp mainApp){
this.mainApp = mainApp;
}

/**
* Open dialog for add a new event, then add it to the event collection
*/
@FXML
private void handleAdd() {
Evento evento = new Evento();
boolean okClicked = mainApp.showEventiEditEditDialog(evento);
if (okClicked)
mainApp.getEventi().add(evento);
}
}

但是后来我尝试更深入地学习,我需要将该事件直接添加到 person->event 中,如果我尝试使用相同的函数添加它,他会将其添加到 mainApp 事件列表中并且即使 mainApp 人员列表已填充人员事件,也不会添加到人员事件列表。

我想知道是否有一种方法可以将 observableList 作为指针传递给 mainApp,或者有一种简单的方法可以达到我的目标。

RootLayoutController在尝试添加事件时并不知道有一个组合框,而mainApp也不必知道有一个组合框,那么如何获取selectedPerson并向他的事件添加事件列表?

我应该在主应用程序中创建一个“activePerson”,并在每次用户将项目更改到组合框中时切换它吗?但在我看来这和“硬编码”方法一样。

你会怎么做?

最佳答案

嗯,设计应用程序没有一种正确的方法。当然,有一些设计原则,您应该尝试遵循。有关该主题的信息很多,因此查找它不会有问题。
关于您的具体情况,我会将组合框和 Person 选择逻辑从 EventiLayoutController 移动到 RootLayoutController。这样,您就可以在根 Controller 中选择 Person 实例,并且可以在发生更改时通知事件 Controller 并向其提供选定的 Person 。可以通过直接在 RootLayoutController 中使用 EventiLayoutController 实例或使用事件总线方法来完成通知。
另外,我将使用属性绑定(bind)(或双向绑定(bind),具体取决于您的逻辑),而不是 mainApp.getEventi().addAll(newValue.getEventi()); 。但实际上我不太明白为什么你需要在 MainApp 中单独的 eventi 集合,如果你无论如何都要用选定的人物事件填充它。

关于java - 如何通过 Combobox 的 selectedItem 操作对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38404644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com