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.
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.