JavaFX 2中的GroupBox / TitledBorder?

有没有JavaFX 2上可用的GroupBox或TitledBorder ?

感谢您的提示:-)

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

/** 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); } } 

和随附的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; } 

该代码来自我为响应Oracle JavaFX论坛主题post“等同于BorderFactory.createTitledBorder”而创build的示例 。

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

葛底斯堡

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

在这里输入图像描述

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

FXML用法:

 <?import com.example.controls.*?> <TitledBorder title="title" > <Label text="label with text" /> </TitledBorder> 

不要忘了样式表!

使用这个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; } 

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

在这里输入图像描述

更新:当标题更长,然后内容的问题:

在这里输入图像描述 任何提示解决这个问题?

这是一个FXML文档,可以加载到具有相似function的SceneBuilder中:

 <?xml version="1.0" encoding="UTF-8"?> <?import java.lang.*?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <AnchorPane style="-fx-border-insets: 8 0 0 0; -fx-background-color: #FFFFFF; -fx-border-color: black;"> <children> <Label alignment="TOP_LEFT" layoutX="14.0" style="-fx-padding: 0 5; -fx-background-color: inherit;" text="Title" /> <AnchorPane prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="1.0" AnchorPane.leftAnchor="1.0" AnchorPane.rightAnchor="1.0" AnchorPane.topAnchor="10.0" /> </children> </AnchorPane> 

如果您需要使标签文本/边框尺寸更大,则只需编辑子AnchorPane的CSS和topAnchor以及父AnchorPane的-fx-border-insets的第一个参数即可。

GroupBox – 就我所见,这是通常的组布局。

TitledBorder – 看起来像TitledPane(通常是Accordion的一个组件,但可能是一个单独存在的控件)。

JavaFX-2模拟器看起来与你的不同(但不是很明显),和往常一样,你可以使用不同的方式来控制外观变化:css,控件的皮肤replace等

这是一个基于TitledPane的GroupBox实现。 它提供了三种方法来设置GroupBox的标题,内容和内容填充。

 public final class GroupBox extends Parent { private StackPane _stackPane; private TitledPane _titledPane; public GroupBox() { _stackPane = new StackPane(); _titledPane = new TitledPane(); setContentPadding(new Insets(10)); _titledPane.setCollapsible(false); _titledPane.setContent(_stackPane); super.getChildren().add(_titledPane); } public GroupBox(String title, Node content) { this(); setText(title); setContent(content); } public GroupBox(String title, Node content, Insets contentPadding) { this(title, content); setContentPadding(contentPadding); } public void setText(String value) { _titledPane.setText(value); } public void setContent(Node node) { _stackPane.getChildren().add(node); } public void setContentPadding(Insets value) { _stackPane.setPadding(value); } }