Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8127919

ListView: custom cell rendering issue

    XMLWordPrintable

Details

    • Bug
    • Resolution: Not an Issue
    • P3
    • fx2.1
    • fx2.0.2
    • javafx
    • Win7/JDK6/b08

    Description

      Sample and bug description is provided by doc writers. To reproduce:
      - scroll down the content of ListView using mouse and scroll bar knob
      - increase ListView height dragging window edge by mouse
      A ghost list item appears.
      setGraphic(null) in updateItem() solves the problem.

      package listviewsample;

      import javafx.application.Application;
      import javafx.beans.value.ChangeListener;
      import javafx.beans.value.ObservableValue;
      import javafx.collections.FXCollections;
      import javafx.collections.ObservableList;
      import javafx.scene.Scene;
      import javafx.scene.control.Label;
      import javafx.scene.control.ListCell;
      import javafx.scene.control.ListView;
      import javafx.scene.layout.Priority;
      import javafx.scene.layout.VBox;
      import javafx.scene.paint.Color;
      import javafx.scene.shape.Rectangle;
      import javafx.scene.text.Font;
      import javafx.stage.Stage;
      import javafx.util.Callback;

      public class Main extends Application {

          ListView<String> list = new ListView<String>();
          ObservableList<String> data = FXCollections.observableArrayList(
                  "chocolate", "salmon", "gold", "coral", "darkorchid",
                  "darkgoldenrod", "lightsalmon", "black", "rosybrown", "blue",
                  "blueviolet", "brown");
          final Label label = new Label();

          @Override
          public void start(Stage stage) {
              VBox box = new VBox();
              Scene scene = new Scene(box, 200, 200);
              stage.setScene(scene);
              stage.setTitle("ListViewSample");
              box.getChildren().addAll(list, label);
              VBox.setVgrow(list, Priority.ALWAYS);

              label.setLayoutX(10);
              label.setLayoutY(115);
              label.setFont(Font.font("Verdana", 20));

              list.setItems(data);

              list.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
                  @Override public ListCell<String> call(ListView<String> list) {
                      return new ColorRectCell();
                  }
              });
       
              list.getSelectionModel().selectedItemProperty().addListener(
                      new ChangeListener<String>() {
                          public void changed(ObservableValue<? extends String> ov,
                              String old_val, String new_val) {
                                  label.setText(new_val);
                                  label.setTextFill(Color.web(new_val));
                          }
                      });
              stage.show();
          }
          
          static class ColorRectCell extends ListCell<String> {
              @Override
              public void updateItem(String item, boolean empty) {
                  super.updateItem(item, empty);
                  Rectangle rect = new Rectangle(100, 20);
                  if (item != null) {
                      rect.setFill(Color.web(item));
                      setGraphic(rect);
                  }/* else {
                      setGraphic(null);
                  }*/
              }
          }
          
          public static void main(String[] args) {
              launch(args);
          }
      }

      Attachments

        Activity

          People

            jgiles Jonathan Giles
            ogb Oleg Barbashov (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:
              Imported: