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

Cannot display Progress bar into Combo box

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Not an Issue
    • Icon: P2 P2
    • None
    • 7u45
    • javafx
    • None
    • Java 8b119

      I want to display Progressbar into Combobox. I tested this code with Java 8b119

      import javafx.application.Application;
      import javafx.geometry.Pos;
      import javafx.scene.Scene;
      import javafx.scene.control.ComboBox;
      import javafx.scene.control.Label;
      import javafx.scene.control.ListCell;
      import javafx.scene.control.ListView;
      import javafx.scene.control.ProgressBar;
      import javafx.scene.layout.HBox;
      import javafx.scene.layout.StackPane;
      import javafx.stage.Stage;
      import javafx.util.Callback;

      public class JavaFXApplication4 extends Application
      {

          @Override
          public void start(Stage primaryStage)
          {

              double y1 = 15;
              ProgressBar p1 = new ProgressBar();
              p1.setLayoutY(y1);
              HBox vb1 = new HBox(10);
              vb1.getChildren().addAll(new Label("Progressbar 1"), p1);

              double y2 = 15;
              ProgressBar p2 = new ProgressBar();
              p2.setLayoutY(y2);
              HBox vb2 = new HBox(10);
              vb2.getChildren().addAll(new Label("Progressbar 2"), p2);

              double y3 = 15;
              ProgressBar p3 = new ProgressBar();
              p3.setLayoutY(y3);
              HBox vb3 = new HBox(10);
              vb3.getChildren().addAll(new Label("Progressbar 3"), p3);

              TextChooser textChooser = new TextChooser(
                  vb1, vb2, vb3
              );

              textChooser.setStyle("-fx-font: 10px \"Verdana\";");

              StackPane root = new StackPane();
              root.getChildren().add(textChooser);

              Scene scene = new Scene(root, 300, 250);

              primaryStage.setTitle("Hello World!");
              primaryStage.setScene(scene);
              primaryStage.show();
          }

          public static class TextChooser extends StackPane
          {
              private Label label = new Label();

              private ComboBox<HBox> combo = new ComboBox<>();

              public TextChooser(HBox... options)
              {
                  StackPane.setAlignment(label, Pos.CENTER_LEFT);
                  StackPane.setAlignment(combo, Pos.CENTER_LEFT);

                  label.graphicProperty().bind(
                      //combo.getSelectionModel().selectedItemProperty()
                      combo.getSelectionModel().selectedItemProperty()
                  );
                  label.visibleProperty().bind(
                      combo.visibleProperty().not()
                  );
                  //label.setPadding(new Insets(0, 0, 0, 10));

                  combo.getItems().setAll(options);

                  //!!!!!!!!!!!!!!!!! combo.setButtonCell(null);

                  combo.setCellFactory(new Callback<ListView<HBox>, ListCell<HBox>>()
                  {
                      @Override
                      public ListCell<HBox> call(ListView<HBox> p)
                      {
                          return new ListCell<HBox>()
                          {
                              @Override
                              protected void updateItem(HBox item, boolean empty)
                              {
                                  super.updateItem(item, empty);

                                  if (item == null || empty)
                                  {
                                      setGraphic(null);
                                  }
                                  else
                                  {
                                      setGraphic(item);
                                  }
                              }
                          };
                      }
                  });

                  combo.getSelectionModel().select(0);
                  combo.setVisible(true);

                  label.setOnMouseEntered(event -> combo.setVisible(true));
                  combo.showingProperty().addListener(observable ->
                  {
                      if (!combo.isShowing())
                      {
                          combo.setVisible(false);
                      }
                  });
                  combo.setOnMouseExited(event ->
                  {
                      if (!combo.isShowing())
                      {
                          combo.setVisible(false);
                      }
                  });

                  getChildren().setAll(label, combo);
              }

              public static void main(String[] args)
              {
                  launch(args);
              }
          }
      }

      I also tested the same code with JavaFX 2.2:

      import javafx.application.Application;
      import javafx.beans.InvalidationListener;
      import javafx.beans.Observable;
      import javafx.event.EventHandler;
      import javafx.geometry.Pos;
      import javafx.scene.Scene;
      import javafx.scene.control.ComboBox;
      import javafx.scene.control.Label;
      import javafx.scene.control.ListCell;
      import javafx.scene.control.ListView;
      import javafx.scene.control.ProgressBar;
      import javafx.scene.input.MouseEvent;
      import javafx.scene.layout.HBox;
      import javafx.scene.layout.StackPane;
      import javafx.stage.Stage;
      import javafx.util.Callback;

      public class JavaFXApplication5 extends Application
      {
      public static void main( String[] args )
      {
      launch( args );
      }

      @Override
      public void start( Stage primaryStage )
      {
      double y1 = 15;
      ProgressBar p1 = new ProgressBar();
      p1.setLayoutY( y1 );
      HBox vb1 = new HBox( 10 );
      vb1.getChildren().addAll( new Label( "Progressbar 1" ), p1 );

      double y2 = 15;
      ProgressBar p2 = new ProgressBar();
      p2.setLayoutY( y2 );
      HBox vb2 = new HBox( 10 );
      vb2.getChildren().addAll( new Label( "Progressbar 2" ), p2 );

      double y3 = 15;
      ProgressBar p3 = new ProgressBar();
      p3.setLayoutY( y3 );
      HBox vb3 = new HBox( 10 );
      vb3.getChildren().addAll( new Label( "Progressbar 3" ), p3 );

      TextChooser textChooser = new TextChooser( vb1, vb2, vb3 );

      textChooser.setStyle( "-fx-font: 10px \"Verdana\";" );

      StackPane root = new StackPane();
      root.getChildren().add( textChooser );

      Scene scene = new Scene( root, 300, 250 );

      primaryStage.setTitle( "Hello World!" );
      primaryStage.setScene( scene );
      primaryStage.show();
      }

      public static class TextChooser extends StackPane
      {
      private final Label label = new Label();

      private final ComboBox<HBox> combo = new ComboBox<>();

      public TextChooser(HBox... options)
      {
      StackPane.setAlignment( label, Pos.CENTER_LEFT );
      StackPane.setAlignment( combo, Pos.CENTER_LEFT );

      label.graphicProperty().bind(
      // combo.getSelectionModel().selectedItemProperty()
      combo.getSelectionModel().selectedItemProperty()
      );
      label.visibleProperty().bind(
      combo.visibleProperty().not()
      );
      // label.setPadding(new Insets(0, 0, 0, 10));

      combo.getItems().setAll( options );

      combo.setCellFactory( new Callback<ListView<HBox>, ListCell<HBox>>()
      {
      @Override
      public ListCell<HBox> call( ListView<HBox> p )
      {
      return new ListCell<HBox>()
      {
      @Override
      protected void updateItem( HBox item, boolean empty )
      {
      super.updateItem( item, empty );

      if ( item == null || empty )
      {
      setGraphic( null );
      }
      else
      {
      setGraphic( item );
      }
      }
      };
      }
      } );

      combo.getSelectionModel().select( 0 );
      combo.setVisible( true );

      label.setOnMouseEntered( new EventHandler<MouseEvent>()
      {
      @Override
      public void handle( MouseEvent event )
      {
      combo.setVisible( true );
      }
      } );

      combo.showingProperty().addListener( new InvalidationListener()
      {
      @Override
      public void invalidated( Observable observable )
      {
      if ( !combo.isShowing() )
      {
      combo.setVisible( false );
      }
      }
      } );

      combo.setOnMouseExited( new EventHandler<MouseEvent>()
      {
      @Override
      public void handle( MouseEvent event )
      {
      if ( !combo.isShowing() )
      {
      combo.setVisible( false );
      }
      }
      } );

      getChildren().setAll( label, combo );
      }

      }

      }

      I cannot display any Progressbar into the Combobox label but this works well in JavaFX 2.2. Maybe this is a bug into Java 8.

            jgiles Jonathan Giles
            ppenzovjfx Peter Penzov (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported: