2016-09-06 2 views
0

Я попытался установить Button в столбце TableView, но мне не удалось установить разные кнопки. Он показывает мне те же кнопки на всех столбцах.Невозможно установить разные значения для таблицы TableColumn в JavaFX

Идея состоит в том, что имя задано правильно, но моя проблема заключается в том, когда я устанавливаю cellValueFactory. Это мой код:

for (int i = 0; i < listaPatchuriPerBaza.length; i++) { 

    if (listaPatchuriPerBaza[i].contains(".sql")) { 
     k = i; 
     pozitie = poz; 
     Patch pt = new Patch(listaPatchuriPerBaza[i], "Run" + " " + listaPatchuriPerBaza[i]); 
     listaPatchuri.add(pt); 
     masterData.add(pt); 
     patchColumn.setCellValueFactory(new PropertyValueFactory<Patch, String>("denumire")); 
     runColumn.setCellValueFactory(new PropertyValueFactory<Patch, String>("btnText")); 
     runColumn.setCellFactory(new Callback<TableColumn<Patch, String>, TableCell<Patch, String>>() { 

      @Override 
      public TableCell<Patch, String> call(TableColumn<Patch, String> param) { 

       Button btn = new Button(pt.getBtnText()); 

       //Set up the Table 
       TableCell<Patch, String> cell = new TableCell<Patch, String>() { 
        @Override 
        protected void updateItem(String item, boolean empty) { 
         super.updateItem(item, empty); 
         if (item != null) { 
          //actioneaza butonul de run 
          btn.setOnAction((ActionEvent event) -> { 
           btn.setDisable(true); 
           Tooltip tool = new Tooltip("Running"); 
           setTooltip(tool); 
           System.out.println("ruleaza"); 
           try { 
            SmbFile script = new SmbFile(path + pt.getDenumire(), userCred); 

           } catch (MalformedURLException e1) { 
            // TODO Auto-generated catch block 
            e1.printStackTrace(); 
           } 
           try { 

            SmbFile smbFromFile = new SmbFile(path + pt.getDenumire(), userCred); 
            SmbFile smbToFile = new SmbFile(path + "Aplicate/" + pt.getDenumire(), userCred); 
            smbFromFile.renameTo(smbToFile); 
           } catch (IOException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 
          }); 
          setGraphic(btn); 

         } 
        } 

       }; 

       return cell; 
      } 
     }); 

    } 

    tableView.setItems(masterData); 

} 

+0

Я не понимаю здесь цикл 'for': пытаетесь ли вы установить заводскую ячейку и заводскую ячейку один раз для каждой строки таблицы? –

+0

@James_D Да, я хочу установить для каждого элемента из моего списка, но я не могу установить кнопку. Имена одобрены. – CobianuA

+0

Это не имеет смысла. В столбце имеется только одна фабрика для значения и одна фабрика для ячейки. Таким образом, вы просто заменяете их на каждой итерации цикла. Это * фабрики *: т. Е. Они вызываются для создания объектов по мере необходимости. –

ответ

4

Это не имеет никакого смысла, чтобы установить значение ячейки завода и фабрики ячеек для каждой строки в таблице: все, что вам сделать, это заменить заводу каждый раз, когда вы итерацию через вашу петлю. Это заводы: объекты, которые создают другие объекты. Столбец таблицы будет называть их call методами, необходимыми для создания нескольких ячеек и т. Д.

Поэтому просто установите их один раз и обновите текст кнопки в методе updateItem(). Кнопка должна быть собственностью ячейки (так что каждая ячейка имеет свою собственную кнопку со своим текстом), а не на сотовой фабрике (потому что для всего столбца имеется только одна фабрика ячеек).

+0

Большое спасибо – CobianuA