jew*_*sea 40

没有这样的标准控制,但它很容易创建自己的.这是一个示例实现:

/** Places content in a bordered pane with a title. */
class BorderedTitledPane extends StackPane {
  BorderedTitledPane(String titleString, Node content) {
    Label title = new Label(" " + titleString + " ");
    title.getStyleClass().add("bordered-titled-title");
    StackPane.setAlignment(title, Pos.TOP_CENTER);

    StackPane contentPane = new StackPane();
    content.getStyleClass().add("bordered-titled-content");
    contentPane.getChildren().add(content);

    getStyleClass().add("bordered-titled-border");
    getChildren().addAll(title, contentPane);
  }
}
Run Code Online (Sandbox Code Playgroud)

随之而来的css:

.label {
  -fx-font: 28px Vivaldi;
}

.bordered-titled-title {
  -fx-background-color: white;
  -fx-translate-y: -16;
}

.bordered-titled-border {
  -fx-content-display: top;
  -fx-border-insets: 20 15 15 15;
  -fx-background-color: white;
  -fx-border-color: black;
  -fx-border-width: 2;
}

.bordered-titled-content {
  -fx-padding: 26 10 10 10;
}
Run Code Online (Sandbox Code Playgroud)

代码来自我为响应Oracle JavaFX论坛帖子帖子"Equivalent to BorderFactory.createTitledBorder"而创建的示例.

示例程序的输出如下所示.

葛底斯堡


And*_*sun 34

我用TitledPanesetCollapsible(false).它看起来比使用CSS样式更一致.这是结果

在此输入图像描述

  • 真的简单方便 (4认同)

ste*_*wpf 11

FXML版的jewelsea答案:

TitledBorder(我将BorderedTitledPane重命名为TitledBorder)

package com.example.controls;

import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;

public class TitledBorder extends StackPane 
{
    private Label titleLabel = new Label();
    private StackPane contentPane = new StackPane();
    private Node content;



    public void setContent(Node content)
    {
        content.getStyleClass().add("bordered-titled-content");
        contentPane.getChildren().add(content);
    }


    public Node getContent()
    {
        return content;
    }


    public void setTitle(String title)
    {
    titleLabel.setText(" " + title + " ");
    }


    public String getTitle()
    {
        return titleLabel.getText();
    }



    public TitledBorder() 
    {
        titleLabel.setText("default title");
        titleLabel.getStyleClass().add("bordered-titled-title");
        StackPane.setAlignment(titleLabel, Pos.TOP_CENTER);

        getStyleClass().add("bordered-titled-border");
        getChildren().addAll(titleLabel, contentPane);
      }

}
Run Code Online (Sandbox Code Playgroud)

FXML用法:

<?import com.example.controls.*?>

<TitledBorder title="title" >       
    <Label text="label with text" />        
</TitledBorder>   
Run Code Online (Sandbox Code Playgroud)

不要忘记样式表!

将此CSS用于普通字体:

.bordered-titled-title {
  -fx-background-color: white;
  -fx-translate-y: -10; /* play around with this value when changing the title font to get a vertically centered title */
}

.bordered-titled-border {
  -fx-content-display: top;
  -fx-border-insets: 20 15 15 15;
  -fx-background-color: white;
  -fx-border-color: black;
  -fx-border-width: 2;
}

.bordered-titled-content {
  -fx-padding: 26 10 10 10;
}
Run Code Online (Sandbox Code Playgroud)

使用这个CSS现在看起来像这样:

在此输入图像描述

更新: 标题长于内容时的问题:

在此输入图像描述 有什么提示可以解决这个问题吗?