2016-02-24 3 views
0

У меня возникла проблема, которую я не могу решить. Дело в том, что мой TableView уже заполнен, и мне нужно, чтобы ячейки, соответствующие моим критериям, устанавливали значение ноль. У меня есть переменная korZemljiste, и если мое состояние заполнено заполненными ячейками в столбце colOsnovica, необходимо установить значение 0.00.Редактирование значения столбца TableView

Вот что я пробовал:

if (korZemljiste < 10000) 
    { 
     tblTabela.getItems().stream().forEach((o) 
      -> { 
       colOsnovica.setCellFactory(TextFieldTableCell.forTableColumn()); 
       colOsnovica.setOnEditCommit(
        new EventHandler<CellEditEvent<Nepokretnost, Number>>() { 
        @Override 
        public void handle(CellEditEvent<Nepokretnost, Number> t) { 
         ((Nepokretnost) t.getTableView().getItems().get(
         t.getTablePosition().getRow()) 
         ).setOsnovica(t.getNewValue()); 
    } 
});});} 

К сожалению, для уродливого конца кода, не мог сделать, чтобы скопировать его должным образом.

В этой части я изменил из примера Oracle и я получаю сообщение об ошибке:

error: incompatible types: no instance(s) of type variable(s) S exist so that Callback<TableColumn<S,String>,TableCell<S,String>> conforms to Callback<TableColumn<Nepokretnost,Number>,TableCell<Nepokretnost,Number>> 
       colOsnovica.setCellFactory(TextFieldTableCell.forTableColumn()); 

, где S представляет собой тип переменной: S простирается Объект объявлен в методе forTableColumn()

error: incompatible types: Number cannot be converted to double 
         ).setOsnovica(t.getNewValue()); 

Мой TableView используя <Nepokretnost, Number> вид.

Примечание: Я думаю, мне не нужен этот пример из сайта Oracle, потому что я не хочу вручную изменять содержимое ячейки в столбце, я просто хочу установить их значение 0.00.

Какое-то простое решение для любого?

Заранее спасибо.

ответ

1

Для первой ошибки, поскольку тип столбца таблицы не является String, вы не можете использовать версию без аргументов TextFieldTableCell.forTableColumn(). Основная проблема заключается в том, что для редактирования ячейки текстовое поле предоставляет String, а данные в ячейке - Number. Вы должны предоставить конвертер, с помощью overloaded form of TextFieldTableCell.forTableColumn(...):

colOsnovica.setCellFactory(TextFieldTableCell.forTableColumn(new NumberStringConverter())); 

Для второй ошибки, просто замените t.getNewValue() (который возвращает Number) с t.getNewValue().doubleValue() (который получает double представление Number).

+0

Я сделал поправку к моему коду на основе вашего предложения. Теперь он работает без ошибок. Спасибо за это. Но, я до сих пор не знаю, как установить значение конкретной ячейки через код до значения 0.00. Я попытался заменить: .setOsnovica (t.getNewValue(). DoubleValue()) с .setOsnovica (0) , но затем не дал желаемого результата. –

+0

Это, вероятно, невозможно получить без дополнительной информации, например. ваш класс «Недокрытность». –

0

@ Джеймсе-й

Hm, моя ошибка. Класс прост, вот он:

package obracun; 

import javafx.beans.property.SimpleDoubleProperty; 
import javafx.beans.property.SimpleStringProperty; 

/** 
* 
* @author Dalibor 
*/ 
public class Nepokretnost { 

private final SimpleStringProperty tipNepokretnosti; 
private final SimpleStringProperty zona; 
private final SimpleStringProperty pravo; 
private final SimpleDoubleProperty povrsina; 
private final SimpleDoubleProperty amortizacija; 
private final SimpleDoubleProperty osnovica; 
private final SimpleDoubleProperty kredit; 
private final SimpleDoubleProperty porez; 

public Nepokretnost(String tipNepokretnosti, String zona, String pravo, 
     Double povrsina, double amortizacija, Double osnovica, Double kredit, Double porez) { 
    this.tipNepokretnosti = new SimpleStringProperty(tipNepokretnosti); 
    this.zona = new SimpleStringProperty(zona); 
    this.pravo = new SimpleStringProperty(pravo); 
    this.povrsina = new SimpleDoubleProperty(povrsina); 
    this.amortizacija = new SimpleDoubleProperty(amortizacija); 
    this.osnovica = new SimpleDoubleProperty(osnovica); 
    this.kredit = new SimpleDoubleProperty(kredit); 
    this.porez = new SimpleDoubleProperty(porez); 


} 

public String getTipNepokretnosti() { 
    return tipNepokretnosti.get(); 
} 

public void setTipNepokretnosti(String tipNepokretnosti) { 
    this.tipNepokretnosti.set(tipNepokretnosti); 
} 

public String getZona() { 
    return zona.get(); 
} 

public void setZona(String zona) { 
    this.zona.set(zona); 
} 

public String getPravo() { 
    return pravo.get(); 
} 

public void setPravo(String pravo) { 
    this.pravo.set(pravo); 
} 

public double getPovrsina() { 
    return povrsina.get(); 
} 

public void setPovrsina(double povrsina) { 
    this.povrsina.set(povrsina); 
} 

public double getAmortizacija() { 
    return amortizacija.get(); 
} 

public void setAmortizacija(double amortizacija) { 
    this.amortizacija.set(amortizacija); 
} 

public double getOsnovica() { 
    return osnovica.get(); 
} 

public void setOsnovica(double osnovica) { 
    this.osnovica.set(osnovica); 
} 

public double getKredit() { 
    return kredit.get(); 
} 

public void setKredit(double kredit) { 
    this.kredit.set(kredit); 
} 

public double getPorez() { 
    return porez.get(); 
} 

public void setPorez(double porez) { 
    this.porez.set(porez); 
} 

} 

Я не понял, что здесь необходимо опубликовать класс. У меня было это приложение, которое было сделано только в Swing. Там я только что изменил содержимое поля JTableView. Это немного другое, спасибо за помощь.

Я разместил и снял скриншот приложения. На скриншоте я уже добавил элементы в TableView, которые я хотел. Код, который я написал в вопросе, является частью обработчика событий Calculate (Обрачун). В этом примере вычисление должно изменить содержимое поля Основица до 0,00.

enter image description here