gpt4 book ai didi

javafx - ComboBox 的 setButtonCell

转载 作者:行者123 更新时间:2023-12-01 09:58:32 33 4
gpt4 key购买 nike

我有一个我无法解决的问题。我想在组合框中实现进度条:

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.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);
}
}
}

你能告诉我如何使用 setButtonCell 才能在组合框中显示 Progressbar 吗?

最佳答案

You should not be placing Nodes into the items list - rather the data should be stored there and then rendered with your cell factory.

例如:

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


public class ProgressData
{
private final DoubleProperty progressProp = new SimpleDoubleProperty();
private final StringProperty progressName = new SimpleStringProperty();

public ProgressData( String name, double progress )
{
progressProp.set( progress );
progressName.set( name );
}

public DoubleProperty progressProperty()
{
return progressProp;
}

public StringProperty nameProperty()
{
return progressName;
}

@Override
// Lazy hack for the combo button.
public String toString()
{
return progressName.get();
}
}


@Override
public void start( Stage primaryStage )
{
ProgressData vb1 = new ProgressData( "Progressbar 1", -1 );
ProgressData vb2 = new ProgressData( "Progressbar 2", 0.2 );
ProgressData vb3 = new ProgressData( "Progressbar 3", 0.3 );

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<ProgressData> combo = new ComboBox<>();

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


final ProgressBar labelBar = new ProgressBar();
label.visibleProperty().bind( combo.visibleProperty().not() );
label.setContentDisplay( ContentDisplay.RIGHT );
label.setGraphic( labelBar );


combo.getItems().setAll( options );

// This will change the label's text and the progress bar value.
combo.getSelectionModel().selectedItemProperty().addListener( new ChangeListener<ProgressData>()
{
@Override
public void changed( ObservableValue<? extends ProgressData> observable, ProgressData oldValue, ProgressData newValue )
{
if ( labelBar.progressProperty().isBound() )
{
labelBar.progressProperty().unbind();
}

labelBar.progressProperty().bind( newValue.progressProperty() );
label.setText( newValue.nameProperty().get() );
}
} );

combo.setCellFactory( new Callback<ListView<ProgressData>, ListCell<ProgressData>>()
{
@Override
public ListCell<ProgressData> call( ListView<ProgressData> p )
{
return new ListCell<ProgressData>()
{
private final ProgressBar cellBar = new ProgressBar();
{
cellBar.setMouseTransparent( true );
setContentDisplay( ContentDisplay.RIGHT );
setGraphic( cellBar );
}

@Override
protected void updateItem( ProgressData item, boolean empty )
{
super.updateItem( item, empty );

if ( item != null && ! empty )
{
if ( cellBar.progressProperty().isBound() )
{
cellBar.progressProperty().unbind();
}
cellBar.progressProperty().bind( item.progressProperty() );
setText( item.nameProperty().get() );
}
}
};
}
} );

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 );
}

}

}

关于javafx - ComboBox 的 setButtonCell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20604974/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com