既然你使用JavaFX,你應該使用ObservableList
爲你的房間。此外,您需要使用FilteredList
和FXCollections.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
,這也會導致已過濾的列表自動更新。
來源
2017-04-26 08:54:22
Jai
你可以做的另一件事是使用HashMap。密鑰可以是唯一的房間號碼,並且可以預訂或未註冊映射的值。 – Sedrick
Duplicate of:http://stackoverflow.com/questions/43598587/javafx-referencing-an-array-list-of-a-smaller-size-to-a-master-array-list? – jewelsea