Javafx PropertyValueFactory не заполняет табличное представление

Это сбило меня с толку некоторое время, и я не могу понять это. Я использую Cell Value Factory, чтобы заполнить простую таблицу с одним столбцом, и она не заполняется в таблице.

Это происходит, и я щелкаю строки, которые заполнены, но я не вижу никаких значений в них - в этом случае значения String. [Я только отредактировал это, чтобы сделать это более ясным]

У меня есть другой проект, в котором он работает под той же моделью данных. Что я делаю неправильно?

Вот код Комментарий в конце, похоже, работает. Я проверил, есть ли обычные ошибки - создание нового экземпляра столбца или нового экземпляра табличного представления. Ничего такого. Пожалуйста помоги!


// Простая модель данных Stock.java

public class Stock {

    private SimpleStringProperty stockTicker;

    public Stock(String stockTicker) {
        this.stockTicker = new SimpleStringProperty(stockTicker);
    }

    public String getstockTicker() {
        return stockTicker.get();
    }

    public void setstockTicker(String stockticker) {
        stockTicker.set(stockticker);
    }
}

// Контроллер класса MainGuiController.java

    private ObservableList<Stock> data;
    @FXML
    private TableView<Stock> stockTableView;// = new TableView<>(data);
    @FXML
    private TableColumn<Stock, String> tickerCol;


    private void setTickersToCol() {
    try {
        Statement stmt = conn.createStatement();//conn is defined and works
        ResultSet rsltset = stmt.executeQuery("SELECT ticker FROM tickerlist order by ticker");
        data = FXCollections.observableArrayList();
        Stock stockInstance;
        while (rsltset.next()) {
            stockInstance = new Stock(rsltset.getString(1).toUpperCase());
            data.add(stockInstance);
        }
    } catch (SQLException ex) {
        Logger.getLogger(WriteToFile.class.getName()).log(Level.SEVERE, null, ex);
        System.out.println("Connection Failed! Check output console");
    }

    tickerCol.setCellValueFactory(new PropertyValueFactory<Stock,String>("stockTicker"));
    stockTableView.setItems(data);
    }

    /*THIS, ON THE OTHER HAND, WORKS*/
    /*Callback<CellDataFeatures<Stock, String>, ObservableValue<String>> cellDataFeat =
            new Callback<CellDataFeatures<Stock, String>, ObservableValue<String>>() {
        @Override
        public ObservableValue<String> call(CellDataFeatures<Stock, String> p) {
            return new SimpleStringProperty(p.getValue().getstockTicker());
        }
    };*/

2 ответа

Решение

Как это исправить

Случай ваших методов получения и установки неправильный.

getstockTicker должно быть getStockTicker

setstockTicker должно быть setStockTicker

Некоторая справочная информация

Ваш PropertyValueFactory остается неизменным с:

new PropertyValueFactory<Stock,String>("stockTicker")

Соглашение об именах будет казаться более очевидным, когда вы также добавите метод доступа к свойству Stock:

public class Stock {

    private SimpleStringProperty stockTicker;

    public Stock(String stockTicker) {
        this.stockTicker = new SimpleStringProperty(stockTicker);
    }

    public String getStockTicker() {
        return stockTicker.get();
    }

    public void setStockTicker(String stockticker) {
        stockTicker.set(stockticker);
    }

    public StringProperty stockTickerProperty() {
        return stockTicker;
    }
}

PropertyValueFactory использует отражение, чтобы найти соответствующие методы доступа. Сначала он попытается использовать метод доступа stockTickerProperty и, если его нет, прибегнуть к методам получения и установки. Рекомендуется предоставить средство доступа к свойству, так как тогда вы автоматически включите свою таблицу для наблюдения за свойством в базовой модели, динамически обновляя свои данные по мере изменения базовой модели.

Поместите метод Getter и Setter в свой класс данных для всех элементов.

Другие вопросы по тегам