JavaFX标签不';t中心,如果不包裹

JavaFX标签不';t中心,如果不包裹,java,javafx,javafx-8,Java,Javafx,Javafx 8,我在JavaFX标签中遇到了一组非常奇怪的情况,即文本换行和居中对齐。我肯定我做错了什么或是做了什么不明智的事,但我似乎无法弄清楚我做错了什么 基本上,我试图在平铺窗格上放置一个标题,并使该标题居中。另外,当窗口调整大小时,我希望标题换行。当标题没有包装(例如:一行)时,它就不再居中了。一旦它卷起,它就会再次居中。下面是一些产生这种效果的示例代码: import javafx.application.Application; import javafx.geometry.Insets; impo

我在JavaFX标签中遇到了一组非常奇怪的情况,即文本换行和居中对齐。我肯定我做错了什么或是做了什么不明智的事,但我似乎无法弄清楚我做错了什么

基本上,我试图在平铺窗格上放置一个标题,并使该标题居中。另外,当窗口调整大小时,我希望标题换行。当标题没有包装(例如:一行)时,它就不再居中了。一旦它卷起,它就会再次居中。下面是一些产生这种效果的示例代码:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.TilePane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import org.apache.commons.lang.RandomStringUtils;
public class Foo extends Application
{
    @Override
    public void start(Stage primaryStage) throws Exception
    {
        TilePane panel = new TilePane();
        panel.setTileAlignment(Pos.CENTER_LEFT);

        for (int i = 0; i < 25; i++)
        {
            panel.getChildren().add(new Label(RandomStringUtils.randomAlphabetic(10)));
        }

        Label title = new Label("Lorem ipsum dolor sit amet, consectetur adipiscing elit");
        title.setStyle("-fx-font-size: 16; -fx-font-weight: bold; -fx-wrap-text:true; -fx-text-alignment: center -fx-border-color:black;");
        title.minWidthProperty().bind(Bindings.add(-30, primaryStage.widthProperty()));
        title.setTextAlignment(TextAlignment.CENTER);

        VBox box = new VBox(title, panel);
        box.setPadding(new Insets(10));

        primaryStage.setScene(new Scene(box, 400, 400));
        primaryStage.show();

    }

    public static void main(String[] args)
    {
        launch(args);
    }
}
导入javafx.application.application;
导入javafx.geometry.Insets;
导入javafx.geometry.Pos;
导入javafx.scene.scene;
导入javafx.scene.control.Label;
导入javafx.scene.layout.TilePane;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
导入org.apache.commons.lang.RandomStringUtils;
公共类Foo扩展应用程序
{
@凌驾
public void start(Stage primaryStage)引发异常
{
TilePane面板=新的TilePane();
面板设置至重新对准(位置居中左);
对于(int i=0;i<25;i++)
{
panel.getChildren().add(新标签(RandomStringUtils.randomAlphabic(10));
}
标签名称=新标签(“Lorem ipsum dolor sit amet,Concertetur Adipising elit”);
title.setStyle(“-fx字体大小:16;-fx字体重量:粗体;-fx换行文本:true;-fx文本对齐:中间-fx边框颜色:黑色;”);
title.minWidthProperty().bind(Bindings.add(-30,primaryStage.widthProperty());
title.setTextAlignment(TextAlignment.CENTER);
VBox框=新的VBox(标题、面板);
框。设置填充(新插图(10));
初级舞台.场景(新场景(框,400400));
primaryStage.show();
}
公共静态void main(字符串[]args)
{
发射(args);
}
}
这是我看到的屏幕截图。在第一种情况下,顶部的粗线居中并包裹。在第二种情况下,顶部的粗线条没有被包裹,而是左对齐


好吧,我尝试了一些不同的策略,并用常规css解决了这个问题。 可以使用“-fx对齐:居中;”进行此操作。有关使用哪种css的更多信息,请参阅。标签的宽度也很重要,否则宽度就是文本的长度,没有任何东西可以真正居中

进行更改时,您的代码将如下所示

@Override
public void start(Stage primaryStage) throws Exception
{
    TilePane panel = new TilePane();
    panel.setTileAlignment(Pos.CENTER_LEFT);

    for (int i = 0; i < 25; i++)
    {
        panel.getChildren().add(new Label(RandomStringUtils.randomAlphabetic(10)));
    }

    Label title = new Label("Lorem ipsum dolor sit amet, consectetur adipiscing elit");
    title.setStyle("-fx-font-size: 16; -fx-font-weight: bold; -fx-wrap-text:true; -fx-alignment: center; -fx-border-color:black;");
    title.setMinWidth(400); //This is important, else the width will just be the text's length

    VBox box = new VBox(title, panel);
    box.setPadding(new Insets(10));

    primaryStage.setScene(new Scene(box, 400, 400));
    primaryStage.show();

}

public static void main(String[] args)
{
    launch(args);
}
@覆盖
public void start(Stage primaryStage)引发异常
{
TilePane面板=新的TilePane();
面板设置至重新对准(位置居中左);
对于(int i=0;i<25;i++)
{
panel.getChildren().add(新标签(RandomStringUtils.randomAlphabic(10));
}
标签名称=新标签(“Lorem ipsum dolor sit amet,Concertetur Adipising elit”);
title.setStyle(“-fx字体大小:16;-fx字体重量:粗体;-fx换行文本:true;-fx对齐:中间;-fx边框颜色:黑色;”);
title.setMinWidth(400);//这很重要,否则宽度将只是文本的长度
VBox框=新的VBox(标题、面板);
框。设置填充(新插图(10));
初级舞台.场景(新场景(框,400400));
primaryStage.show();
}
公共静态void main(字符串[]args)
{
发射(args);
}

好吧,我尝试了一些不同的策略,并用常规css解决了这个问题。 可以使用“-fx对齐:居中;”进行此操作。有关使用哪种css的更多信息,请参阅。标签的宽度也很重要,否则宽度就是文本的长度,没有任何东西可以真正居中

进行更改时,您的代码将如下所示

@Override
public void start(Stage primaryStage) throws Exception
{
    TilePane panel = new TilePane();
    panel.setTileAlignment(Pos.CENTER_LEFT);

    for (int i = 0; i < 25; i++)
    {
        panel.getChildren().add(new Label(RandomStringUtils.randomAlphabetic(10)));
    }

    Label title = new Label("Lorem ipsum dolor sit amet, consectetur adipiscing elit");
    title.setStyle("-fx-font-size: 16; -fx-font-weight: bold; -fx-wrap-text:true; -fx-alignment: center; -fx-border-color:black;");
    title.setMinWidth(400); //This is important, else the width will just be the text's length

    VBox box = new VBox(title, panel);
    box.setPadding(new Insets(10));

    primaryStage.setScene(new Scene(box, 400, 400));
    primaryStage.show();

}

public static void main(String[] args)
{
    launch(args);
}
@覆盖
public void start(Stage primaryStage)引发异常
{
TilePane面板=新的TilePane();
面板设置至重新对准(位置居中左);
对于(int i=0;i<25;i++)
{
panel.getChildren().add(新标签(RandomStringUtils.randomAlphabic(10));
}
标签名称=新标签(“Lorem ipsum dolor sit amet,Concertetur Adipising elit”);
title.setStyle(“-fx字体大小:16;-fx字体重量:粗体;-fx换行文本:true;-fx对齐:中间;-fx边框颜色:黑色;”);
title.setMinWidth(400);//这很重要,否则宽度将只是文本的长度
VBox框=新的VBox(标题、面板);
框。设置填充(新插图(10));
初级舞台.场景(新场景(框,400400));
primaryStage.show();
}
公共静态void main(字符串[]args)
{
发射(args);
}
如中所述,文本对齐控制多行文本的对齐。这正是指定的行为

如果你想象一个矩形来限制所有的文本,当文本有多行时,就必须决定这些单独的行在该矩形中的布局。这由
textAlignment
属性控制。默认情况下,将每条线与框的左侧对齐:也可以居中、右对齐或对齐(展开每条线以填充框)。另一种方式是
textAlignment
仅控制每行文本相对于其他文本行的位置

另一方面,
alignment
属性定义标签内容(文本和图形)在标签本身内的对齐方式(如果标签中的空间大于文本所占的空间)。因此,要使标签在
VBox
中居中,首先需要确保标签填充
VBox
的整个宽度,然后需要将
对齐
属性设置为
居中
。通过设置标签的
maxWidth
,使其无限增长,并将
VBox
fillWidth()
属性设置为
true
,可以实现前者

使用Java这看起来像

public void start(Stage primaryStage) throws Exception
{
    TilePane panel = new TilePane();
    panel.setTileAlignment(Pos.CENTER_LEFT);

    for (int i = 0; i < 25; i++)
    {
        panel.getChildren().add(new Label(randomAlphabetic(10)));
    }

    Label title = new Label("Lorem ipsum dolor sit amet, consectetur adipiscing elit");
    title.setStyle("-fx-font-size: 16; -fx-font-weight: bold; -fx-wrap-text:true; -fx-border-color:black;");

        title.setPadding(new Insets(5));
        title.setAlignment(Pos.CENTER);
        title.setMaxWidth(Double.MAX_VALUE);


    title.setTextAlignment(TextAlignment.CENTER);

    VBox box = new VBox(title, panel);
    box.setFillWidth(true); 

    box.setPadding(new Insets(10));

    primaryStage.setScene(new Scene(box, 400, 400));
    primaryStage.show();

}
public void start(Stage primaryStage)引发异常
{
TilePane面板=新的TilePane();
面板