40

JavaFX 2 で利用できるGroupBoxTitledBorderのようなものはありますか?

ヒントをありがとう:-)

4

6 に答える 6

49

そのような標準コントロールはありませんが、独自のコントロールを作成するのは簡単です。実装例を次に示します。

/** 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"に対応して私が作成したからのものです。

サンプルプログラムの出力は次のとおりです。

ゲティスバーグ

于 2013-02-13T22:01:40.177 に答える
45

で使用TitledPaneしましsetCollapsible(false)た。CSS スタイルを使用するより一貫性があります。ここに結果があります

ここに画像の説明を入力

于 2016-06-18T04:22:43.537 に答える
14

ジュエルシーの答えの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 を使用すると、次のようになります。

ここに画像の説明を入力

更新: タイトルがコンテンツよりも長い場合の問題:

ここに画像の説明を入力 この問題を解決するためのヒントはありますか?

于 2013-02-14T11:50:06.810 に答える
0

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);
    }
}
于 2017-01-12T04:37:15.380 に答える
0

GroupBox - 私が見る限り、これは通常のグループ レイアウトです。

TitledBorder - TitledPane のように見えます (通常は Accordion のコンポーネントですが、別の既存のコントロールである場合もあります)。

JavaFX-2 アナログはあなたのものとは異なって見えます (ただし、それほど大きくはありません)。いつものように、コントロールの外観を変更するさまざまな方法を使用できます: css、コントロールのスキンの置き換えなど

于 2013-02-13T19:05:42.880 に答える