我有一个带有进度条的组合框示例。
package javafxapplication4;
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.StackPane;
import javafx.scene.layout.VBox;
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);
VBox vb1 = new VBox();
vb1.getChildren().addAll(new Label("Progressbar 1"), p1);
double y2 = 15;
ProgressBar p2 = new ProgressBar();
p2.setLayoutY(y2);
VBox vb2 = new VBox();
vb2.getChildren().addAll(new Label("Progressbar 2"), p2);
double y3 = 15;
ProgressBar p3 = new ProgressBar();
p3.setLayoutY(y3);
VBox vb3 = new VBox();
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<VBox> combo = new ComboBox<>();
public TextChooser(VBox... 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<VBox>, ListCell<VBox>>() {
@Override public ListCell<VBox> call(ListView<VBox> p) {
return new ListCell<VBox>() {
@Override protected void updateItem(VBox 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);
}
}
}
我想在应用程序运行时显示一个进度条,其中包含正在运行的后台进程。当我将鼠标移到进度条上时,我想看到所有进程。但由于某些原因,代码无法正常工作-当我选择进度条时,没有显示进度条。你能帮我识别这个密码吗。
如贴在这里https://stackoverflow.com/a/20630806/3110608
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 );
}
}
}
要更改“按钮”中的显示(即所选值的显示),您需要使用
combo.setButtonCell(...);
然而,我认为这对你的情况不起作用。问题是您有一个Node子类(VBox)作为ComboBox的类型。因此,选定项目将出现在场景图形中的两个位置:一个在下拉列表中,一个在组合框按钮中。通常,使用节点作为组合框的类型是一个非常糟糕的主意:请参阅Javadocs:
强烈建议不要将节点放入项目列表。
您应该使用ComboBox的数据类型,并在ListCell实现中创建VBox。
问题内容: 我正在尝试使用node-imagemagick库调整图像的大小,但无法正常工作。 我用来调整大小的代码是 引发错误 问题答案: 在Windows上,您还需要安装imagemagick exe。nodejs imagemagick库只是imagemagick exe的包装器。因此,只有安装了imagemagick exe并转换并标识可执行文件在路径中后,它才能起作用。
问题内容: 我在linux ubuntu 17.10上运行代码 此代码返回“无限” 但是每当我从终端运行命令时,我都会得到1024。 为什么这些数字不同? 问题答案: 如果从命令行运行相同的命令,则会得到相同的结果: 这是因为仅查看紧随其后的参数。的不是此参数的一部分,并且被代替而不是分配作为位置参数()。 要运行,需要成为该参数的一部分: 换句话说,您应该使用:
问题内容: 我正在尝试使用以下代码: 我需要检查是否返回false,但是当删除时,它不再起作用。为什么会这样,我如何使它起作用? 问题答案: 当您引入警报时它起作用的原因是,它停止了执行并为异步调用提供了足够的时间来完成。 您没有获得正确的值,因为在发布请求完成且回调已执行时,您的JavaScript已经完成执行。 您在这里有一些选择: 声明全局变量并执行同步调用,您可以使用发布的代码ABC进行此
问题内容: 我一直在尝试放置一些基本的CSS3动画。目的是在按钮的click事件上切换类,并根据添加的类为div设置动画。该代码非常适合Firefox中的第一个切换迭代,但是对于Chrome等其他浏览器以及Firefox中的下一个迭代,只需瞬间即可切换。请帮助我找出问题所在。 片段: 我也在这里准备了一个小提琴。 问题答案: 这是Chrome的一种已知行为。Firefox似乎确实能够在过渡过程中顺
问题内容: 我正试图将网页嵌入iframe中,但它根本不起作用。具有相对路径的内部页面正常显示。但是这个简单的代码不起作用: 应该显示iframe的地方是空的。我在页面源代码中查找,之后没有任何内容 怎么会这样? 问题答案: Google使用X-FRAME-OPTIONSHTTP标头禁止将其页面放置在iframe中:: //developer.mozilla.org/en/The_X-FRAME-
问题内容: 我试图使用jQuery和CodeIgniter使用JSON进行我的第一个AJAX调用。但是出于某些奇怪的原因,它不起作用。 jQuery代码: CodeIgniter代码: 我尝试手动访问该页面,但似乎可以正常工作,我得到了: 我还尝试使用Firebug进行查看,但什么也没看到。 我不知道我在做什么错…真的很需要帮助。谢谢。 问题答案: 您可能需要设置HTTP内容类型才能使其正常工作: