2017-08-30 27 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