如何通过Combobox的selectedItem操作Object

时间:2016-07-15 20:35:40

标签: java javafx combobox

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

现在的问题是:

我有一个mainApp,包含observable人员列表和observable事件列表

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中创建了一个comboBox和一个tableView,当我使用一个监听器更改组合框时,tableView将填充该person对象的事件列表,我用选定的人填充mainApp事件列表活动清单

(EventiController)

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”来将事件添加到mainApp列表中,在rootLayoutController中(显示menuBar和菜单项的那个,其中Add按钮是)< / p>

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-&gt;事件中,如果我尝试使用相同的功能添加它,他会将其添加到mainApp事件列表中而不是人事件列表,即使主要人员名单中充满了人事件。

我想知道是否有办法将observableList作为指针传递给mainApp,或者有一种简单的方法来实现我的目标。

RootLayoutController在尝试添加事件时不知道有一个组合框,而且mainApp也不必知道有一个组合框,所以如何获取selectedPerson并为他的事件添加一个事件列出?

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

你会怎么做?

1 个答案:

答案 0 :(得分:1)

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