2017-04-26 203 views
0

我正在寫兩個菜單,員工和客人的模擬酒店預訂系統。創建的房間存儲在名爲roomArray的主數組中,並添加到員工菜單中的列表視圖中,並添加到訪客菜單中的列表視圖中。客房可以提供或預訂,但只有客房菜單列表視圖中顯示,所以我可能有5個房間,但只有2個顯示在客人菜單列表視圖。如果用戶點擊第二個,我不想嘗試預訂主roomArray靜態ArrayList中的索引1房間,因爲它們不匹配。JavaFX參考一個主數組列表

例如,在員工列表視圖中說,我有三個房間,其中兩個預訂。在賓客列表視圖中,只有可用的房間出現。因此,右側的列表視圖將顯示選定的索引0,但主房間陣列中相同的索引對於同一個房間爲1。如何創建一個介紹主列表中房間的可用房間數組列表的中介?

彌敦道

+0

你可以做的另一件事是使用HashMap。密鑰可以是唯一的房間號碼,並且可以預訂或未註冊映射的值。 – Sedrick

+0

Duplicate of:http://stackoverflow.com/questions/43598587/javafx-referencing-an-array-list-of-a-smaller-size-to-a-master-array-list? – jewelsea

回答

2

既然你使用JavaFX,你應該使用ObservableList爲你的房間。此外,您需要使用FilteredListFXCollections.observableArrayList(extractor)

這是如何實現它:

public class Room { 
    public enum State {AVAILABLE, BOOKED} 

    private final ObjectProperty<State> state = new SimpleObjectProperty<>(AVAILABLE); 
    public final ObjectProperty<State> stateProperty() { return state; } 
    public final State getState() { return state.get(); } 
    public final void setState(final State value) { state.set(state); } 
} 

主要類:

private final ObservableList<Room> rooms; 
public final ObservableList<Room> getRooms() { return rooms; } 

private final ObservableList<Room> guestRooms; 
public final ObservableList<Room> getGuestRooms() { return guestRooms; } 

// Constructor 
public MyClass() { 
    rooms = FXCollections.observableArrayList(room -> new Observable[] {room.stateProperty()}); 

    guestRooms = rooms.filtered(room -> room.getState() == Room.State.AVAILABLE); 
} 

guestRooms名單僅僅是rooms名單的包裝,具有Predicate過濾。已過濾列表將根據rooms列表更改,但它只會響應列表本身的更改(添加,刪除或替換元素)。爲確保它響應現有房間狀態的變化,您需要使用FXCollections.observableArrayList(extractor)過載。通過此超載,您可以控制每個對象中的哪個屬性也會觸發ListChangeListener.Change,這也會導致已過濾的列表自動更新。