Использование кнопки в tableColumn для добавления песни в список воспроизведения javafx

Я хотел иметь столбец таблицы с кнопкой с надписью «Добавить в список воспроизведения». Строка в столбце представляет собой песню. У меня есть следующий класс:

private class ButtonCell extends TableCell<Record, Boolean> {
    final Button cellButton = new Button("Add to PlayList");

    ButtonCell(){

        cellButton.setOnAction(new EventHandler<ActionEvent>(){

            @Override
            public void handle(ActionEvent t) {
                // do something when button clicked
                //playList.add(this.getTableRow().getItem());
            }
        });
    }

    //Display button if the row is not empty
    @Override
    protected void updateItem(Boolean t, boolean empty) {
        super.updateItem(t, empty);
        if(!empty){
            setGraphic(cellButton);
        }
    }
}

EventHandler<ActionEvent> btnNewHandler = 
        new EventHandler<ActionEvent>(){

    @Override
    public void handle(ActionEvent t) {


    }
};

И я хочу иметь возможность сделать это 'playList.add(this.getTableRow().getItem());' Есть ли способ сделать это?

Суть вопроса в том, как получить информацию о ячейке и добавить эту информацию в наблюдаемый список?

Спасибо


person get_swifty    schedule 16.01.2015    source источник


Ответы (1)


По какой-то причине getTableRow()< /a> возвращает необработанный объект TableRow вместо универсально типизированного. Другими словами, сигнатура метода

public class TableCell<S,T> {
    public TableRow getTableRow();
}

когда я думаю, что это должно быть

public class TableCell<S,T> {
    public TableRow<S> getTableRow();
}

Из-за этого выражение getTableRow().getItem() имеет тип времени компиляции Object вместо того же типа, что и таблица (Record в вашем примере), поэтому вам нужно приведение вниз. Это должно работать (при условии, что все остальное настроено так, как я ожидаю):

playList.add((Record) this.getTableRow().getItem() );

Совершенно другой метод заключается в том, чтобы сделать тип столбца Record, поэтому вы можете просто вызвать getItem() непосредственно в ячейке. Ответ на этот вопрос использует этот подход.

person James_D    schedule 16.01.2015
comment
ha я продолжаю решать некоторые из моих собственных проблем, но я не знаю, как решить следующее: 'ошибка: не найден подходящий метод для add(Object) MusicPlayer.playlist.add(getTableRow().getItem() ); ^ метод Collection.add(Song) неприменим (несоответствие аргументов; объект не может быть преобразован в песню) метод List.add(Song) неприменим (несоответствие аргументов; объект не может быть преобразован в песню)' - person get_swifty; 18.01.2015