JavaFX2:包含文本的可调整大小的矩形
我想显示一个包含文本/标签的矩形。为此,我创建了一个stackpane并添加了一个矩形和一个标签。但是,文本/标签未正确居中。它位于矩形的外部(左侧)。这是我当前使用的代码:JavaFX2:包含文本的可调整大小的矩形,java,binding,javafx,javafx-2,Java,Binding,Javafx,Javafx 2,我想显示一个包含文本/标签的矩形。为此,我创建了一个stackpane并添加了一个矩形和一个标签。但是,文本/标签未正确居中。它位于矩形的外部(左侧)。这是我当前使用的代码: createRectangle(String name) { pane = new StackPane(); text = new Label(name); rect = new Rectangle(); // bind rectangle width to text width and add 1
createRectangle(String name) {
pane = new StackPane();
text = new Label(name);
rect = new Rectangle();
// bind rectangle width to text width and add 10
rect.widthProperty().bind(text.widthProperty().add(10));
rect.heightProperty().bind(text.heightProperty().add(10));
// add to stackpane
pane.getChildren().addAll(rect,text);
// display stackpane
getChildren().add(pane)
}
我尝试绑定矩形的xProperty()和yProperty(),更改stackpane的对齐方式(setAlignment(Pos.CENTER))和其他内容,但没有成功
当我使用固定的矩形尺寸(例如新矩形(30,30))并且不使用绑定时,标签在矩形内正确居中。但是,矩形的大小需要根据标签大小进行调整:
// label is placed correctly in the center of the rectangle
createRectangle(String name) {
pane = new StackPane();
text = new Label(name);
rect = new Rectangle(30,30);
// add to stackpane
pane.getChildren().addAll(rect,text);
// display stackpane
getChildren().add(pane)
}
对于标签大小的背景 只需在标签上直接使用CSS,就不需要任何其他节点
Label label = new Label("Sally collects seashells on the seashore");
label.setStyle("-fx-background-color: coral; -fx-padding: 10px;");
填充可用于调整标签周围矩形背景区域的大小
用于可调整大小的背景
您不需要矩形节点,将标签放在StackPane中,并在StackPane上设置背景:
Label label = new Label("Sally collects seashells on the seashore");
StackPane centeredLabel = new StackPane(label);
centeredLabel.setStyle("-fx-background-color: coral;");
可执行示例
注意:这个答案中的内联样式只是为了便于演示,最佳实践是使用CSS样式表来定义CSS样式
我还想使用其他形状(特别是圆形矩形和圆形),而不是普通矩形。这是否可以通过按照您的答案中的建议设计stackpane或标签本身的样式来实现
是的,从中派生的任何内容(包括布局窗格(如StackPane)和控件(如Label))都可以通过CSS进行广泛的样式设置
要获得圆形背景,可以使用-fx background radius
要获得任意形状的背景,您可以使用fx shape
,尽管您可能会发现在任意形状的背景中定位文本很困难
您还可以在代码中编写形状,并使用绑定使其适合您最初在问题中尝试的内容
如果需要进行大量的微调,那么您可以将region子类化并覆盖layoutChildren方法,以便对该方法中的所有子类执行精确的布局计算(这是大多数内置JavaFX控件在其皮肤类中处理布局的方式)
不管怎么说,一个看似简单的问题并不总是有一个简单的答案,因为最终在你做事的方式和你想做的事情上都会有很多变化,比如如何处理包装文本、插入、是否将文本删除到最小大小之外等等
然而,对于矩形或圆角矩形背景的最常见任务,我坚持直接在标签上使用CSS样式。通过使用样式表,您可以轻松地完全更改标签的应用程序样式
下面是一个更广泛、更过分的示例:
LabelBackground.java
label-styles.css
如果您非常希望获得更多的示例,请查看处理可调整大小的标签背景样式的方式 用于标签大小的背景 只需在标签上直接使用CSS,就不需要任何其他节点
Label label = new Label("Sally collects seashells on the seashore");
label.setStyle("-fx-background-color: coral; -fx-padding: 10px;");
填充可用于调整标签周围矩形背景区域的大小
用于可调整大小的背景
您不需要矩形节点,将标签放在StackPane中,并在StackPane上设置背景:
Label label = new Label("Sally collects seashells on the seashore");
StackPane centeredLabel = new StackPane(label);
centeredLabel.setStyle("-fx-background-color: coral;");
可执行示例
注意:这个答案中的内联样式只是为了便于演示,最佳实践是使用CSS样式表来定义CSS样式
我还想使用其他形状(特别是圆形矩形和圆形),而不是普通矩形。这是否可以通过按照您的答案中的建议设计stackpane或标签本身的样式来实现
是的,从中派生的任何内容(包括布局窗格(如StackPane)和控件(如Label))都可以通过CSS进行广泛的样式设置
要获得圆形背景,可以使用-fx background radius
要获得任意形状的背景,您可以使用fx shape
,尽管您可能会发现在任意形状的背景中定位文本很困难
您还可以在代码中编写形状,并使用绑定使其适合您最初在问题中尝试的内容
如果需要进行大量的微调,那么您可以将region子类化并覆盖layoutChildren方法,以便对该方法中的所有子类执行精确的布局计算(这是大多数内置JavaFX控件在其皮肤类中处理布局的方式)
不管怎么说,一个看似简单的问题并不总是有一个简单的答案,因为最终在你做事的方式和你想做的事情上都会有很多变化,比如如何处理包装文本、插入、是否将文本删除到最小大小之外等等
然而,对于矩形或圆角矩形背景的最常见任务,我坚持直接在标签上使用CSS样式。通过使用样式表,您可以轻松地完全更改标签的应用程序样式
下面是一个更广泛、更过分的示例:
LabelBackground.java
label-styles.css
如果您非常希望获得更多的示例,请查看处理可调整大小的标签背景样式的方式 谢谢你的详细回答。对于我给出的描述,这个解决方案将是完美的,但是,我忘了提到(或者认为这无关紧要)我还想使用其他形状(特别是圆形矩形和圆形)而不是普通矩形。这可以通过按照您的答案中的建议设计stackpane或标签本身来实现吗?再次感谢。我想这足以满足我的申请。谢谢
.root {
-fx-font-size: 16px;
}
.rounded-label {
-fx-background-color: cadetblue;
-fx-padding: 10px;
-fx-background-radius: 10px;
}
.square-label {
-fx-background-color: plum;
-fx-padding: 10px;
}
.star-label {
-fx-background-color: gold;
-fx-padding: 120px;
/* shape courtesy of Smiffy's star place: http://www.smiffysplace.com/stars.html */
-fx-shape: "M 0.000 20.000 L 23.511 32.361 L 19.021 6.180 L 38.042 -12.361 L 11.756 -16.180 L 0.000 -40.000 L -11.756 -16.180 L -38.042 -12.361 L -19.021 6.180 L -23.511 32.361 L 0.000 20.000";
}
.resizable-background {
-fx-background-color: coral;
}
.elliptical-label .ellipse {
-fx-fill: lightpink;
}