JavaFX 11:向右侧的TitledPane添加图形?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (198)

自从JavaFX 8问到这个原始问题以来,JavaFX发生了很多事情。最近发布了JavaFX 11。

有一个使用JavaFX 11的项目.TitledPane图形设置有一个HBox,其中包含我想要放置在标题最右侧的一个Button。

TitledPane titledPane = new TitledPane();
titledPane.setText("Title");

HBox titleBox = new HBox();
Button b1 = new Button("ClickMe!");
titleBox.getChildren().add(b1);

titledPane.setGraphic(titleBox);
titledPane.setContentDisplay(ContentDisplay.RIGHT);

将TitlePane对齐设置为CENTER_RIGHT会将标题置于右侧,但整个标题,文本和图形。

titledPane.setAlignment(Pos.CENTER_RIGHT);

我试过在TitledPane图形,HBox,GridPane中试验不同的容器。设置增长,对齐,fillWidth等无效。

如果没有设置人为的图形差距,我认为没有可行的解决方案,但黑客在上面提到的问题中提出了这个问题。这是一个丑陋的黑客。适用于Acrodion中的多个TitledPanes。但是按钮没有放在确切的末端,标题右侧还有更多的空间。

    primaryStage.setOnShown(e -> {
        for (TitledPane titledPane : panes) {
            Node titleRegion = titledPane.lookup(".title");
            Insets padding = ((StackPane) titleRegion).getPadding();
            double graphicWidth = titledPane.getGraphic().getLayoutBounds().getWidth();
            double arrowWidth = titleRegion.lookup(".arrow-button").getLayoutBounds().getWidth();
            double labelWidth = titleRegion.lookup(".text").getLayoutBounds().getWidth();
            double nodesWidth = graphicWidth + padding.getLeft() + padding.getRight() + arrowWidth + labelWidth;
            titledPane.graphicTextGapProperty().bind(titledPane.widthProperty().subtract(nodesWidth));
        }
    });
提问于
用户回答回答于

我不确定我是否完全理解你的目标,但我相信你希望TitledPane同时具有左对齐和右对齐的a Label和a Button,对吗?LabelButton,为了做到这一点,需要一些解决方法并使用JavaFX的容器。首先,不需要为自己设置标题TitledPane; 我们将Label在我们的图形中添加一个作为标题。

在下面的示例中,我们将使用a HBox来保存我们想要的所有节点TitledPane。在其中HBox,我们添加一个Region设置为始终在其中增长的内容HBox。这迫使Button一直到右边。

然后,由于TitledPane其图形具有半固定的最大宽度,我们需要使用填充将我们绑定HBox到宽度,TitledPane以避免重叠“展开”箭头。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TitledPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // Simple interface
        VBox root = new VBox(5);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        // Create the TitlePane
        TitledPane titledPane = new TitledPane();
        titledPane.setAlignment(Pos.CENTER);

        // Create HBox to hold our Title and button
        HBox contentPane = new HBox();
        contentPane.setAlignment(Pos.CENTER);

        // Set padding on the left side to avoid overlapping the TitlePane's expand arrow
        // We will also pad the right side
        contentPane.setPadding(new Insets(0, 10, 0, 35));

        // Now, since the TitlePane's graphic node generally has a fixed size, we need to bind our
        // content pane's width to match the width of the TitledPane. This will account for resizing as well
        contentPane.minWidthProperty().bind(titledPane.widthProperty());

        // Create a Region to act as a separator for the title and button
        HBox region = new HBox();
        region.setMaxWidth(Double.MAX_VALUE);
        HBox.setHgrow(region, Priority.ALWAYS);

        // Add our nodes to the contentPane
        contentPane.getChildren().addAll(
                new Label("Titles Are Cool"),
                region,
                new Button("Click me!")
        );

        // Add the contentPane as the graphic for the TitledPane
        titledPane.setGraphic(contentPane);

        // Add the pane to our root layout
        root.getChildren().add(titledPane);

        // Show the Stage
        primaryStage.setWidth(400);
        primaryStage.setHeight(300);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

结果:

这是一个相当干净的解决方案,不认为它是一个“黑客”,只需使用JavaFX的容器和结构

用户回答回答于

不需要将容器用于图形节点-只需将其向右转换:

TitledPane titledPane = new TitledPane("Title", null);
titledPane.setPrefSize(400, 200);

Button graphic = new Button("Click me!");
titledPane.setGraphic(graphic);
titledPane.setContentDisplay(ContentDisplay.RIGHT);

final double graphicMarginRight = 10; //change it, if needed

graphic.translateXProperty().bind(Bindings.createDoubleBinding(
    () -> titledPane.getWidth() - graphic.getLayoutX() - graphic.getWidth() - graphicMarginRight,
    titledPane.widthProperty())
);

扫码关注云+社区

领取腾讯云代金券