我正在编写一个模拟酒店预订系统,有两个菜单:员工和客人。创建的房间存储在名为 roomArray 的主数组中,并添加到员工菜单中的 ListView 中,并添加到宾客菜单中的 ListView 中。房间可以是可用的或可预订的,但是只有可用的房间才会显示在宾客菜单 ListView 中,所以我可能有 5 个房间,但只有 2 个房间显示在宾客菜单 ListView 中。如果用户点击第二个房间,我不想尝试预订主房间Array static ArrayList中的索引1房间,因为它们不匹配。
例如,假设在员工 ListView 中我有三个房间,其中两个已预订。在宾客 ListView 中,仅显示可用的房间。因此,右侧的 ListView 将显示选定的索引 0,但主 roomArray 中同一房间的相同索引为 1。如何制作引用主列表中房间的可用房间数组列表的中介?
内森
最佳答案
由于您使用的是 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
列表进行更改,但它只会对列表本身的更改使用react(添加、删除、替换元素)。为了确保它响应现有房间状态的变化,您需要使用 FXCollections.observableArrayList(extractor)
重载。此重载允许您控制每个 Room
对象中的哪个属性也会触发 ListChangeListener.Change
,这也会导致筛选列表自行更新。
关于JavaFX引用主数组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43625334/