我有这个代码是用来显示文本到组合框。
ProgressBar pb1 = new ProgressBar(0.6);
ProgressIndicator pi1 = new ProgressIndicator(0.6);
VBox vb1 = new VBox();
vb1.getChildren().addAll(new Label("Progressbar 1"), pi1);
ProgressBar pb2 = new ProgressBar(0.6);
ProgressIndicator pi2 = new ProgressIndicator(0.6);
VBox vb2 = new VBox();
vb2.getChildren().addAll(new Label("Progressbar 2"), pi2);
ProgressBar pb3 = new ProgressBar(0.6);
ProgressIndicator pi3 = new ProgressIndicator(0.6);
VBox vb3 = new VBox();
vb3.getChildren().addAll(new Label("Progressbar 3"), pi3);
TextChooser textChooser = new TextChooser(
vb1, vb2, vb3
);
textChooser.setStyle("-fx-font: 10px \"Verdana\";");
VBox layout = new VBox(textChooser);
layout.setPadding(new Insets(22, 22, 22, 22));
public static class TextChooser extends StackPane {
private Label label = new Label();
private ComboBox<String> combo = new ComboBox<>();
public TextChooser(String... options) {
StackPane.setAlignment(label, Pos.CENTER_LEFT);
StackPane.setAlignment(combo, Pos.CENTER_LEFT);
label.textProperty().bind(
combo.getSelectionModel().selectedItemProperty()
);
label.visibleProperty().bind(
combo.visibleProperty().not()
);
label.setPadding(new Insets(0, 0, 0, 10));
combo.getItems().setAll(options);
combo.getSelectionModel().select(0);
combo.setVisible(false);
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);
}
}
在我的情况下,我无法将VBox插入到组合框中。任何想法,我该如何解决这个问题?
您的代码的最大问题是当形参是< code>Strings时,试图使用< code>VBoxes构造< code>TextChooser。将您的构造函数更改为< code>public TextChooser(VBox...options)和< code>ComboBox声明到< code>private ComboBox
现在您将能够将项目添加到组合框中,如果它有效,您就完成了。如果您在将Node
添加到ComboBox
时遇到问题,您可能需要添加更多代码。问题和解决方案在ComboBox
的Javadoc中进行了描述:http://docs.oracle.com/javafx/2/api/javafx/scene/control/ComboBox.html.要解决您选择的项目将从组合框中删除的问题,您需要更改此代码(取自javadoc):
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);
}
}
};
}
});
在getItems().setAll(options)行之后
。
这是您的完整示例代码将变成的样子:
ProgressBar pb1 = new ProgressBar(0.6);
ProgressIndicator pi1 = new ProgressIndicator(0.6);
VBox vb1 = new VBox();
vb1.getChildren().addAll(new Label("Progressbar 1"), pi1);
ProgressBar pb2 = new ProgressBar(0.6);
ProgressIndicator pi2 = new ProgressIndicator(0.6);
VBox vb2 = new VBox();
vb2.getChildren().addAll(new Label("Progressbar 2"), pi2);
ProgressBar pb3 = new ProgressBar(0.6);
ProgressIndicator pi3 = new ProgressIndicator(0.6);
VBox vb3 = new VBox();
vb3.getChildren().addAll(new Label("Progressbar 3"), pi3);
TextChooser textChooser = new TextChooser(
vb1, vb2, vb3
);
textChooser.setStyle("-fx-font: 10px \"Verdana\";");
VBox layout = new VBox(textChooser);
layout.setPadding(new Insets(22, 22, 22, 22));
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.textProperty().bind(
combo.getSelectionModel().selectedItemProperty()
);
label.visibleProperty().bind(
combo.visibleProperty().not()
);
label.setPadding(new Insets(0, 0, 0, 10));
combo.getItems().setAll(options);
// vvvv Begin Optional Part vvvv
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);
}
}
};
}
});
// ^^^^ End Optional Part ^^^^
combo.getSelectionModel().select(0);
combo.setVisible(false);
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);
}
}
问题内容: 该和不改变自己的价值,方法结束时才。 问题答案: 您正在阻止事件分发线程,这将阻止它更新UI。您可以使用,但Swing是单线程API,这意味着只能从事件分配线程的上下文中对UI进行更新。 您可以使用,这将允许您在后台线程中执行长时间运行的过程,但是它支持将更新安全地同步到UI。 加之其与支持,就很容易进行管理,例如。 “进度窗格” 您可以在EDT中使用/ 支持和更新EDT,支持或工作人
我正在努力让Jasper在图表的条形图上显示值标签。我想生成什么: 我使用Jaspersoft Studio,并在“图表绘图”选项卡中选中了“显示标签”框。出于测试目的,我使用了某种红色和紫色作为项目标签的字体颜色和背景颜色,这在条形图上应该很明显。 我的jrxml文件如下所示: 我还尝试使用定制器,基于一些SO问题: 我没法让它工作,我有上面的条形图,但没有110/760标签。 为了显示这些值,
问题内容: 如何显示来自数据框的堆叠式Barh图表的值?如何将标签放置在每个栏上其相应区域的上方,并修改字体,使其以灰度图形的形式很好地显示? 它与此问题有关,但是它具有一个值列表,而不是从熊猫数据框中提取的两个列表。如果这是一个单列表,我想我可以从数据框中的单个记录中提取值,但可以有两个列表,我不确定如何将其应用于条形图中的每个条形。 我的数据框: 我的代码: 问题答案: 您可以通过注释条与参考
我想创建一个显示为组合框的组列表: 当我添加list groups . set editable(true);默认选定组的标签不可读。你能帮我解决这个问题吗?另外,你能告诉我如何优化这个代码,使之易于使用吗?
我有一个带有进度条的组合框示例。 我想在应用程序运行时显示一个进度条,其中包含正在运行的后台进程。当我将鼠标移到进度条上时,我想看到所有进程。但由于某些原因,代码无法正常工作-当我选择进度条时,没有显示进度条。你能帮我识别这个密码吗。