【问题标题】:JavaFX reference a master array listJavaFX 引用一个主数组列表
【发布时间】:2017-09-23 08:00:11
【问题描述】:

我正在编写一个带有两个菜单的模拟酒店预订系统,员工和客人。创建的房间存储在一个名为 roomArray 的主数组中,并添加到员工菜单中的列表视图中,并添加到来宾菜单中的列表视图中。房间可以提供或预订,但只有可用房间显示在客人菜单列表视图中,所以我可能有 5 个房间,但只有 2 个房间显示在客人菜单列表视图中。如果用户点击第二个,我不想尝试在主 roomArray 静态 ArrayList 中预订索引为 1 的房间,因为它们不匹配。

例如,假设在员工列表视图中我有三个房间,其中两个已预订。在客人列表视图中,仅显示可用房间。因此右侧的列表视图将显示选定的索引为 0,但同一房间的 master roomArray 中的相同索引为 1。如何在主列表中引用房间的可用房间数组列表的中介?

内森

【问题讨论】:

标签: java arrays listview arraylist javafx


【解决方案1】:

由于您使用的是 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) 过载。此重载允许您控制每个Room 对象中的哪些属性也会触发ListChangeListener.Change,这也会导致过滤后的列表自行更新。

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 2016-11-27
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多