16

これはしばらくの間私を困惑させ、私はそれを理解することができないようです. Cell Value Factory を使用して単純な 1 列のテーブルにデータを入力していますが、テーブルに入力されません。

入力された行をクリックしますが、値が表示されません。この場合は文字列値です。【分かりやすいように編集しました】

同じ種類のデータ モデルで動作する別のプロジェクトがあります。私は何を間違っていますか?

これがコードです。ただし、最後にコメントされたコードは機能しているようです。通常の間違い (新しい列インスタンスまたは新しいテーブルビュー インスタンスの作成) があるかどうかを確認しました。何もない。助けてください!


//単純なデータ モデル 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());
        }
    };*/
4

2 に答える 2

45
推奨される解決策 (PropertyValueFactory ではなく Lambda を使用)

それ以外の:

aColumn.setCellValueFactory(new PropertyValueFactory<Appointment,LocalDate>("date"));

書く:

aColumn.setCellValueFactory(cellData -> cellData.getValue().dateProperty());

詳細については、次の回答を参照してください。


PropertyValueFactory を使用したソリューション

上で概説したラムダ ソリューションが推奨されますが、PropertyValueFactory を使用する場合は、この代替ソリューションがそれに関する情報を提供します。

修正方法

getter メソッドと setter メソッドのケースが間違っています。

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 アクセサーの使用を試みます。それが存在しない場合は、ゲッターとセッターにフォールバックします。プロパティ アクセサーを提供することをお勧めします。これにより、テーブルが基になるモデルのプロパティを自動的に監視できるようになり、基になるモデルの変更に応じてそのデータが動的に更新されます。

于 2013-06-11T05:35:53.980 に答える
-2

すべての要素のデータ クラスに Getter メソッドと Setter メソッドを配置します。

于 2016-12-29T18:00:35.283 に答える