Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Layout JavaFX2中的GroupBox/标题边框?_Layout_Javafx 2_Groupbox_Titled Border - Fatal编程技术网

Layout JavaFX2中的GroupBox/标题边框?

Layout JavaFX2中的GroupBox/标题边框?,layout,javafx-2,groupbox,titled-border,Layout,Javafx 2,Groupbox,Titled Border,javafx2上是否有类似或可用的功能 感谢您的提示:-)GroupBox-据我所知,这是常见的组布局 TitleBorder-看起来像一个TitlePane(它通常是Accordion的一个组件,但可以是一个单独存在的控件) JavaFX-2类似物看起来与您的不同(但不是很明显),并且像往常一样,您可以使用不同的方式更改控件外观:css、控件的外观替换等。没有这样的标准控件,但是创建自己的控件很容易。下面是一个示例实现: /** Places content in a bordered pan

javafx2上是否有类似或可用的功能


感谢您的提示:-)

GroupBox-据我所知,这是常见的组布局

TitleBorder-看起来像一个TitlePane(它通常是Accordion的一个组件,但可以是一个单独存在的控件)


JavaFX-2类似物看起来与您的不同(但不是很明显),并且像往常一样,您可以使用不同的方式更改控件外观:css、控件的外观替换等。没有这样的标准控件,但是创建自己的控件很容易。下面是一个示例实现:

/** 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论坛帖子而创建的一篇文章

示例程序的输出如下所示


jewelsea答案的FXML版本:

TitleBorder(我将BordedTitledPane重命名为TitleBorder)

FXML用法:

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

<TitledBorder title="title" >       
    <Label text="label with text" />        
</TitledBorder>   
使用此CSS,现在看起来如下所示:

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


有什么提示可以解决这个问题吗?

我使用了
标题窗格
设置可折叠(false)
。它看起来比使用CSS样式更加一致。这是结果


这里有一个FXML文档,可以加载到具有类似功能的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>


如果需要增大标签文本/边框大小,则只需编辑CSS和子AnchorPane的topAnchor以及父AnchorPane的-fx border insets的第一个参数

下面是一个基于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);
    }
}

太棒了,谢谢你!你有没有想过一个完全可以使用FXML的版本,因此可以在FXML中设置标题和内容?有了一个FXML版本,请参阅下面的答案。但是,我需要一个普通/较小的字体,在这种情况下,标题没有居中(垂直!)到边框-有什么提示吗?修好了,请看下面的我的答案。jewelsea,你能添加一个从Oracle论坛返回到这个线程的链接吗(对于FXML版本)?嗯,标题较长的问题,请看下面的我的答案。有什么提示吗?:将Content width绑定到label width+一些偏移量左右?@jewelsea是否可以创建标题窗格,其边框和平铺的样式(大小、颜色)与其他JavaFX组件完全相同?setContent()方法的用途是什么?当FxmlLoader解析fxml文档时,永远不会调用它!我一直在寻找这个:)-但它并没有在场景中打开bulider@stefan如果可以找到一种方法使标题标签的最大长度等于容器的长度,则可以使用省略号字符串解决问题。在该年之后;)也许像我这样的人还在寻找它。我使用了类似的解决方案,并在标签的左右两侧添加了一些边距。非常简单方便
<?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>
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);
    }
}