既然你使用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