2017-04-26 75 views
0

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

例如,在员工列表视图中说,我有三个房间,其中两个预订。在宾客列表视图中,只有可用的房间出现。因此,右侧的列表视图将显示选定的索引0,但主房间阵列中相同的索引对于同一个房间为1。如何创建一个介绍主列表中房间的可用房间数组列表的中介?

弥敦道

+0

你可以做的另一件事是使用HashMap。密钥可以是唯一的房间号码,并且可以预订或未注册映射的值。 – Sedrick

+0

Duplicate of:http://stackoverflow.com/questions/43598587/javafx-referencing-an-array-list-of-a-smaller-size-to-a-master-array-list? – jewelsea

回答

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)过载。通过此超载,您可以控制每个对象中的哪个属性也会触发ListChangeListener.Change,这也会导致已过滤的列表自动更新。