GroupBox / TitledBorder в JavaFX 2?
Есть ли что-то вроде GroupBox или TitledBorder на JavaFX 2?
Спасибо за любой намек 🙂
- LinearLayout не расширяется внутри ScrollView
- Как указать различные макеты в файле ViewStart бритвы ASP.NET MVC 3?
- перемещать текстовое представление только при открытии виртуальной клавиатуры на Android
- Почему нет метода getContentView () для Activity?
- Обновите обновление ProgressBar
- DIV против таблиц или CSS против того, чтобы быть глупым
- Переключение между представлением fragmentа
- разница между @id и @android: id
- Редактор макета Android ConstraintLayout
- Android: Пользовательская панель заголовка
- Как раздуть один вид с помощью макета
- Android SDK 22 - проблемы с визуализацией SearchView
- RelativeLayout принимает полноэкранный режим для wrap_content
Нет такого стандартного контроля, но его легко создать самостоятельно. Вот пример реализации:
/** 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 «Эквивалент BorderFactory.createTitleBorder» .
Вывод примерной программы приведен ниже.
Я использовал TitledPane
с setCollapsible(false)
. Он выглядит более последовательным, чем использование стилей CSS. Вот результат
FXML-версия ответа драгоценности:
TitledBorder (я переименовал BorderedTitlePane в 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); } }
с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:
Не забывайте стильный лист!
Используйте этот 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, который можно загрузить в SceneBuilder, который имеет аналогичную функциональность:
Если вам нужно увеличить размер текста / frameworks метки, вам нужно будет только отредактировать CSS и верхний символ дочерней AnchorPane и первый аргумент -fx-border-insets родительской AnchorPane.
Насколько мне известно, GroupBox – это обычный групповой макет.
TitledBorder – выглядит как TitledPane (который обычно является компонентом Accordion, но может быть отдельно существующим элементом управления).
Аналоги JavaFX-2 отличаются от ваших (но не значительно), и, как обычно, вы можете использовать различные способы изменения внешнего вида управления: css, замена скина управления и т. Д.
Вот реализация GroupBox на основе TitledPane. Он предоставляет три метода для настройки заголовка, содержимого и содержимого 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); } }