2016-12-09 8 views
1

Я хочу обновить изображение в моем окне (в javafx) всякий раз, когда я нажимаю на строку таблицы.
Таблица имеет тип <PopulateTable>; Вот код этого класса:Выбор Tablerow в JavaFX

public class PopulateTable { 

    private final SimpleIntegerProperty count; 
    private final SimpleStringProperty name; 
    private final SimpleStringProperty date; 

    public PopulateTable(int count, String name, String date) { 
     super(); 
     this.count = new SimpleIntegerProperty(count); 
     this.name = new SimpleStringProperty(name); 
     this.date = new SimpleStringProperty(date); 
    } 

Проблема заключается в том, что когда я выбираю одну строку следует начинать метод, который требует тип файла в качестве параметра (который я правильно хранится в массиве: final List <file> files = new ArrayList <>();). Я нашел этот совет здесь, на SO, но не fuziona me ... где, по-вашему, я ошибаюсь?

Вот метод, который я нашел:

public void printWaveForm(){ 
    Table1.setRowFactory(tv -> { 
     TableRow<PopulateTable> row = new TableRow<>(); 
     row.setOnMouseClicked(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
       if(event.getClickCount()>=1) { 
        try { 
         plot(); 
        } catch (java.lang.Exception e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 
     return row; 
     }); 
    } 

И здесь, метод, который строка таблицы должна начинаться сразу выбранный:

public void plot(){ 
    lineChart.getData().clear(); 
    xAxis = new NumberAxis(); 
    yAxis = new NumberAxis();; 
    File file = files.get(Table1.getSelectionModel().getSelectedIndex()); 
    try { 
     AudioWaveformCreator.start(file); 
     extractedData = Waveform.points(); 
     XYChart.Series<Number,Number> series = new XYChart.Series<Number,Number>(); 
     for(int i =0; i<extractedData.size(); i++){ 
      series.getData().add(new XYChart.Data<Number, Number>(i,extractedData.get(i))); 
     } 
     lineChart.getData().add(series); 
    } catch (java.lang.Exception e) { 
     e.printStackTrace(); 
    } 
} 

Заранее спасибо всем, кто поможет мне ,

+0

Не используйте '<>' разметку внешнего кода. Stackoverflow рассматривает их как элементы html и удаляет их, если только они не являются допустимыми элементами, например '
'. Используйте встроенную разметку кода ('\' \ ''), если вы хотите отобразить что-то вроде этого. – fabian

+0

спасибо и извините. –

ответ

3

Так как вы хотите, чтобы реагировать на изменение выбранного элемента, вы можете добавить прослушиватель к selectedIndex собственности в модели выбора в TableView:

Table1.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -> plot()); 

вместо того, чтобы использовать пользовательские строки завода.

+0

Я должен поместить эту строку вместо «Table1.setRowFactory (tv -> {"? –

+0

@ReDePasquale Да, поскольку щелчок по строке приводит к изменению выбора (если только строка не была выбрана, но в этом случае вы делаете не нужно перезагружать данные) .Кроме того, это также сработает, если вы измените выбор с помощью клавиш со стрелками (все, если метод 'printWaveForm' выполняется не более одного раза). – fabian

+0

Все еще не работает ... может быть, потому, что Я не могу понять, какие значения следует использовать вместо (наблюдаемый, oldValue, newValue). Можете ли вы мне помочь? –

Смежные вопросы