2016-07-15 2 views
0

На всякий случай, кто-то хочет мне помочь, я по достоинству оценю это, потому что я ноб в java и пытаюсь научиться просто концепции и, в то же время, к поддерживать код чистым и просто читать. Если вы думаете, что это глупый вопрос, потому что у меня неправильный подход с кодированием, я действительно буду заботиться о вашем мнении, и если вы объясните мне, почему я попытаюсь получить ваш опыт.Как манипулировать объектом через выбранный элемент Combobox

Сейчас вопросы есть:

У меня есть mainApp, содержащий observableList лиц и observableList событий

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 есть список событий, тоже, я создал его после того, как, потому что я пытался для создания гибкого графического интерфейса, поэтому в этом случае вместо одного списка событий каждый отдельный список имеет свой список событий.

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

я создал в EventyLayout выпадающего и Tableview, когда я изменить выпадающий, используя слушатель, то Tableview будет заполняться со списком событий этого лицом объекта, я сделал, что заполнение списка событий mainApp с выбранным Person События Список

(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()); 
} 

}

Прежде чем проект был без possibilit у для переключения пользователей, и я создал «handleAddEvent», чтобы добавить событие в список mainApp, в rootLayoutController (тот, который показал мне Menubar и пункт меню, где Add кнопка)

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->, если я попытаюсь добавить его с помощью той же функции, он добавит его в список событий mainApp, а не в список событий person , даже если список основных участниковApp заполнен событиями человека.

Мне было интересно, есть ли способ передать в качестве указателя наблюдаемый список mainApp, или есть простой способ достичь моей цели.

RootLayoutController не знал, что есть комбобокс, когда он пытается добавить событие, а mainApp тоже не должен был знать, что есть combobox, поэтому, как получить selectedPerson и добавить событие в его список событий?

Должен ли я создать «activePerson» в mainApp и переключать его каждый раз, когда пользователь меняет элемент в combobox? Но мне это кажется и методом «жесткого кодирования».

Как вы это сделаете?

ответ

1

Ну, нет ни одного правильного способа проектирования приложения. Конечно, есть некоторые принципы проектирования, над которыми вам следует попытаться следовать. Существует много информации о теме, поэтому не будет проблемы с ее поиском.
О вашем конкретном случае, я бы переместил combobox и Person логику выбора от EventiLayoutController до RootLayoutController. Таким образом, вы бы выбрали экземпляр Person в корневом контроллере и можете уведомить контроллер событий о произошедшем изменении и предоставить выбранный Person. Уведомление может быть выполнено либо с помощью экземпляра EventiLayoutController непосредственно в RootLayoutController, либо, например, с использованием подхода к шине данных.
Также вместо mainApp.getEventi().addAll(newValue.getEventi()); Я бы использовал привязку свойств (или двунаправленную привязку, в зависимости от вашей логики). Но на самом деле я не совсем понимаю, зачем вам нужно отдельную коллекцию eventi в MainApp, если вы все равно заполняете ее событиями выбранного человека.

Смежные вопросы