8

カスタム ListView セルがあり、2 つのコントロールを持つ HBox があります。

  1. 名前フィールド付きのラベル
  2. オブジェクトのコンテキストから生成する必要があります

たとえば、クラス フィールドの ListView 項目配列を設定します。フィールド タイプが Boolean の場合は CheckBox を作成し、String の場合は TextField などを作成します。

問題は: メソッド updateItem() でのみ Field オブジェクトを取得し、そこでのみコントロールを作成できます。

JavaFX 7 ではすべて正常に動作しますが、Java 8 ではコントロールが表示されません。

私のケースを解決する正しい方法はありますか?

更新 1

レプリケートの問題の完全な例を次に示します。

package javafx8listviewexample;

import java.lang.reflect.Field;
import java.net.URL;
import java.util.Date;
import java.util.ResourceBundle;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.DatePicker;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.TextFieldListCell;
import javafx.util.Callback;

/**
 *
 * @author dmitrynelepov
 */
public class FXMLDocumentController implements Initializable {

    static class TestClassForListView {

        public String fieldString;
        public Date fieldDate;
    }

    static class MyListCell extends ListCell<Field> {

        /**
         * As in tutorial
         *
         * @param t
         * @param bln
         */
        @Override
        protected void updateItem(Field t, boolean bln) {
            super.updateItem(t, bln);
            if (t != null) {
                if (t.getType().equals(String.class)) {
                    System.out.println("Draw string");
                    setGraphic(new TextField(t.getName()));
                } else if (t.getType().equals(Date.class)) {
                    System.out.println("Draw Date");
                    setGraphic(new DatePicker());

                }
            }
        }

    }

    @FXML
    private ListView<Field> listView;

    @FXML
    private void handleButtonAction(ActionEvent event) {
        this.listView.getItems().clear();
        this.listView.setItems(
                FXCollections.observableArrayList(
                        TestClassForListView.class.getFields()
                )
        );
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        this.listView.setCellFactory(new Callback<ListView<Field>, ListCell<Field>>() {

            @Override
            public ListCell<Field> call(ListView<Field> p) {
                return new MyListCell();
            }
        });

    }

}

プログラムJDK 7のスクリーンショット

ここに画像の説明を入力

ご覧のとおり、TextField にフォーカスして編集することができます。

しかし、この例をJDK 8で実行すると、

ここに画像の説明を入力

ここでわかるように、TextField にフォーカスして編集することはできません。

4

1 に答える 1