JavaFX2:包含文本的可调整大小的矩形

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

我想显示一个包含文本/标签的矩形。为此,我创建了一个stackpane并添加了一个矩形和一个标签。但是,文本/标签未正确居中。它位于矩形的外部(左侧)。这是我当前使用的代码:

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