2017-08-30 26 views
0

如果我有了对象的ArrayList对象:如何从具有javafx中对象的数组列表的对象创建组合框?

class Event{   
    private ArrayList<Room> rooms; 
    //.. 
    public void setRooms(ArrayList<Room> rooms) { 
     this.rooms = rooms; 
    } 

    public ArrayList<Room> getRooms() { 
     return rooms; 
    } 
} 

// ---------------------

class Room{ 
    private String roomId; 
    private String roomName; 

    public Room(String roomId, String roomName) { 
     this.roomId = roomId; 
     this.roomName = roomName; 
    } 

    public String getRoomId() { 
     return roomId; 
    } 

    public String getRoomName() { 
     return roomName; 
    } 

    public void setRoomId(String roomId) { 
     this.roomId = roomId; 
    } 

    public void setRoomName(String roomName) { 
     this.roomName = roomName; 
    } 
} 

如何从房间对象数组中创建组合框中的组合框?

我只是显示某种对象标识符。

TableColumn<Event, ArrayList> roomsColumn = new TableColumn<>("Room Select"); 
roomsColumn.setMinWidth(200); 
roomsColumn.setCellValueFactory(new PropertyValueFactory<>("rooms")); 

//Create an observable list to populate the table with. 
ObservableList<Event> eventList = FXCollections.observableArrayList(); 

//loop the json to populate the observable list 
for (Event event : events.getEventList()){ 
    eventList.add(event); 
} 

//populate the table 
eventTable.setItems(eventList); 
eventTable.getColumns().addAll(eventColumn, bDateColumn, eDateColumn, roomsColumn); 

**所有列都建,但房间栏显示一个逗号分隔的房间列表对象:

com.***[email protected], com.***[email protected], com.***[email protected] 
+0

令人困惑的是,为什么要使用'ComboBox'使'TableCell'呈现一个列表。您的表格是供用户读取数据还是收集数据? – Jai

+2

如果它是用于显示(读取)数据,那么'rooms'列表应该被渲染为一个简单的'Label',可能通过'roomName'的连接。如果它应该用于数据收集,那么您只希望用户选择一个房间,所以'Event'类包含'rooms'列表将会是错误的 - 您可能需要创建一个单独的模型类用于存储收集的数据。 – Jai

+0

我希望用户能够从房间列表中选择..行将是事件,事件日期,事件时间,(comboBox)事件室 – silversunhunter

回答

1

你需要一个定制的电池工厂与组合框返回的TableCell。

roomsColumn.setCellFactory(call -> { 
     // create a new cell for array lists 
     return new TableCell<Event, ArrayList<String>>() { 
      @Override 
      protected void updateItem(ArrayList<String> item, boolean empty) { 
       super.updateItem(item, empty); 
       // if there is no item, return an empty cell 
       if (empty || item == null) { 
        setGraphic(null); 
       } 
       else { 
        ComboBox<String> box = new ComboBox<>(); 
        // set combo box items 
        box.setItems(FXCollections.observableArrayList(item)); 
        // listen for changes 
        box.valueProperty().addListener((observable, oldValue, newValue) -> { 
         System.out.println("new room "+newValue); 
        }); 
        // set cell contents 
        setGraphic(box); 
       } 
      } 
     }; 
    }); 
+0

感谢B.Thomas ..我从提供JSON字符串的API获取事件和房间。所以我把Event作为Array里面的ArrayList的唯一原因是因为我觉得GSON需要这些类来匹配我得到的JSON数据,这些数据嵌套在Event中。我确实有一个ArrayList的getter和setter。查看更新到我的问题的获取和设置器 – silversunhunter

+1

现在更有意义,我会编辑我的答案。 –

+0

Hi B. Thomas。这工作!我还没有完全理解它,但它把组合框放在我需要它的地方。谢谢!一个问题。组合框是否意识到它引用的对象?我能够选择一个选项并获取对象吗? – silversunhunter