我正在写一个模拟的酒店预订系统,有两个菜单,员工和客人。创建的房间存储在名为roomArray的主数组中,并添加到员工菜单中的列表视图中,并添加到访客菜单中的列表视图中。客房可以预订或预订,但只有客房菜单列表视图中显示可用的房间,所以我可能有5个房间,但在客人菜单列表视图中只有2个显示。如果用户点击第二个,我不想尝试在主roomArray静态ArrayList中预订索引1房间,因为它们不匹配。
例如,在员工列表视图中,我有三个房间,其中两个是预订的。在访客列表视图中,仅显示可用的房间。因此,右侧的列表视图将显示选定的索引0,但主roomArray中的相同索引对于同一个房间为1。如何设置引用主列表中房间的可用房间的数组列表呢?
森
答案 0 :(得分:2)
由于您使用的是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)
重载。此重载允许您控制每个Room
对象中的哪个属性也会触发ListChangeListener.Change
,这也会导致已过滤的列表自行更新。