JavaFX 2 で利用できるGroupBoxやTitledBorderのようなものはありますか?
ヒントをありがとう:-)
JavaFX 2 で利用できるGroupBoxやTitledBorderのようなものはありますか?
ヒントをありがとう:-)
そのような標準コントロールはありませんが、独自のコントロールを作成するのは簡単です。実装例を次に示します。
/** 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 フォーラムのスレッド投稿"Equivalent to BorderFactory.createTitledBorder"に対応して私が作成した例からのものです。
サンプルプログラムの出力は次のとおりです。
ジュエルシーの答えのFXMLバージョン:
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 を使用すると、次のようになります。
更新: タイトルがコンテンツよりも長い場合の問題:
この問題を解決するためのヒントはありますか?
TitledPane に基づく GroupBox の実装を次に示します。GroupBox のタイトル、コンテンツ、およびコンテンツ パディングを設定する 3 つのメソッドを提供します。
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);
}
}
GroupBox - 私が見る限り、これは通常のグループ レイアウトです。
TitledBorder - TitledPane のように見えます (通常は Accordion のコンポーネントですが、別の既存のコントロールである場合もあります)。
JavaFX-2 アナログはあなたのものとは異なって見えます (ただし、それほど大きくはありません)。いつものように、コントロールの外観を変更するさまざまな方法を使用できます: css、コントロールのスキンの置き換えなど