2016-07-15 18 views
0

誰かが私を助けたいと思うような場合には、私は多くのことに感謝します。私はJavaのnoobであり、単純な概念を学び、同時にコードをきれいにして、簡単に読むことができます。あなたがコーディングに間違ったアプローチをしているので、それが愚かな質問だと思うなら、私はあなたの意見を本当に気にします。今ComboboxのselectedItemを使ってオブジェクトを操作する方法

質問は次のとおりです。

私は人々のobservableListを含む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オブジェクトのobservableListが、私は後にそれを作成し、あまりにもイベントのリストを持っています応答性の高いGUIを作成するため、この場合、1つのイベントリストではなく、すべての個人がイベントリストを持ちます。

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

は私がリスナーを使用して、コンボボックスを変更すると、のtableViewは、その人のオブジェクトのイベントのリストが取り込まれますEventyLayoutコンボボックスとのtableView、に作成された、私がやったことmainAppですイベントのリストを埋めますプロジェクトがpossibilitなしだった前に選択された人のイベント一覧

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

}

とユーザーを切り替えるには、Y、iは

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

(ボタンを追加してくれのmenuBarメニュー項目を表示1は、ある)rootLayoutControllerで、mainAppですリストにイベントを追加するために「handleAddEvent」を作成したが、その後、私もっと深く学習しようとしましたが、そのイベントをperson->イベントに直接追加する必要があります。同じ関数を使用して追加しようとすると、mainAppイベントリストに追加され、personイベントリストには追加されませんたとえメインアプリの人物リストが人物イベントで満たされていても。

observableListをmainAppに渡す方法があるのか​​、それとも私の目的を達成するための簡単な方法があるのだろうかと思っていました。

RootLayoutControllerは、彼がイベントを追加しようとするとコンボボックスがあることを知らず、mainAppもコンボボックスがあることを知る必要はなかったので、selectedPersonを取得し、イベントリスト?

mainAppに「activePerson」を作成し、ユーザーがアイテムをコンボボックスに変更するたびに切り替える必要がありますか?しかし、それは私と "ハードコーディング"方法のようです。

どうすればよいですか?

答えて

1

まあ、アプリケーションを設計する正しい方法はありません。もちろん、いくつかの設計原則があります。その原則に従わなければなりません。トピックに関する多くの情報がありますので、問題を見つけることはありません。
具体的には、コンボボックスとPerson選択ロジックをEventiLayoutControllerからRootLayoutControllerに移動します。このようにして、ルートコントローラでPersonインスタンスを選択し、変更が発生したときにイベントコントローラに通知し、選択したものをPersonに与えることができます。通知は、EventiLayoutControllerインスタンスを直接RootLayoutControllerに置くか、イベントバスアプローチなどを使用して行うことができます。
また、mainApp.getEventi().addAll(newValue.getEventi());の代わりに、プロパティバインディング(またはロジックに応じて双方向バインディング)を使用します。とにかく、あなたが選択した人物のイベントをとにかく埋めているのであれば、なぜあなたはMainAppで別々のコレクションが必要なのかをよく分かりません。

関連する問題