JavaFX引用主数组列表

时间:2017-04-26 04:52:58

标签: java arrays listview arraylist javafx

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

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

1 个答案:

答案 0 :(得分:2)

由于您使用的是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,这也会导致已过滤的列表自行更新。