- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在互联网上的任何地方都找不到这方面的答案。
我有一个必须具有可折叠面板的应用程序,因此 Java FX 中的 TitledPane 和 Accordion 设置是一个自然的选择。
在应用程序中,我需要在容器折叠时为其自定义 header 。我在 TitledPane 的 css 文档中看到标题实际上是一个 HBox 和各种其他组件。
http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html#titledpane
我想访问此组件并将其替换为自定义组件。
我一直在使用 TitledPane api 的 setGraphic 函数并将 setContentDisplay 设置为 GraphicOnly。使用自定义组件。但是,我无法正确渲染它。我在删除箭头和删除箭头占用的空间方面遇到了问题。
有关所需外观的屏幕截图及其实际外观,请参阅下面的链接。
如何去除箭头和填充?
最佳答案
TitledPane 是一个 Labeled,因此您可以 set a graphic在监听器或绑定(bind)到 expanded 上属性(property)。
更改背景颜色等(包括重写 :focused 伪类的样式)可以通过 css 完成(有关示例,请参阅 jfxrt.jar 中 caspian.css 样式表的 TitledPane 部分)。
如果您需要基于代码访问 TitledPane 的子组件,您可以使用 lookup将 TitledPane 添加到舞台上显示的场景后的函数。
adminPane.lookup(".arrow").setVisible(false);
我建议在尝试查找之前尝试基于图形/CSS 样式表的方法。
如果您不需要 Labeled 来显示文本,则将其设置为显示 graphic only .
titledPane.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
下面是一些示例代码,它在没有自定义标题的 TitledPane 旁边显示一个带有自定义标题的 TitledPane。
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.Pos;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.image.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
/** http://stackoverflow.com/questions/11765436/how-to-change-header-component-in-titledpane-in-javafx */
public class TitledPaneCustomization extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage primaryStage) {
TitledPane adminPane = new TitledPane("Administration",
VBoxBuilder.create().style("-fx-padding: 10").spacing(10).children(
ButtonBuilder.create().text("Admin Client").maxWidth(Double.MAX_VALUE).build(),
ButtonBuilder.create().text("Admin User").maxWidth(Double.MAX_VALUE).build()
).build()
);
adminPane.setAnimated(false);
adminPane.getStyleClass().add("admin");
Node open = HBoxBuilder.create().spacing(5).children(
new Circle(4, 4, 8, Color.FORESTGREEN),
new Rectangle(50, 16, Color.AQUAMARINE)
).build();
Node closed = HBoxBuilder.create().spacing(5).children(
new Circle(4, 4, 8, Color.GOLDENROD),
new Rectangle(50, 16, Color.AQUAMARINE)
).build();
adminPane.graphicProperty().bind(
Bindings
.when(adminPane.expandedProperty())
.then(open)
.otherwise(closed)
);
adminPane.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
TitledPane viewPane = new TitledPane("View",
VBoxBuilder.create().style("-fx-padding: 10").spacing(10).children(
ButtonBuilder.create().text("View Client").maxWidth(Double.MAX_VALUE).build(),
ButtonBuilder.create().text("View User").maxWidth(Double.MAX_VALUE).build()
).build()
);
viewPane.setAnimated(false);
VBox errorPane = VBoxBuilder.create().style("-fx-padding: 10").spacing(10).children(
new Label("500: Aug 8, 12:15pm"),
new Label("404: Aug 7, 3:27am")
).build();
Label nErrors = new Label();
nErrors.getStyleClass().add("nerrors");
nErrors.textProperty().bind(Bindings.size(errorPane.getChildren()).asString());
TitledPane connectivityPane = new TitledPane(
"",
errorPane
);
Label connectivityErrorLabel = new Label("CONNECTIVITY ERROR");
connectivityErrorLabel.getStyleClass().add("connectivityErrorLabel");
connectivityPane.getStyleClass().add("connectivity");
connectivityPane.setAnimated(false);
connectivityPane.setGraphic(
HBoxBuilder.create().spacing(2).alignment(Pos.CENTER).styleClass("header").children(
nErrors,
new ImageView(
new Image(
"http://openiconlibrary.sourceforge.net/gallery2/open_icon_library-full/icons/png/48x48/actions/network-disconnect-2.png",
0, 24, true, true
)
),
connectivityErrorLabel
).build()
);
HBox layout = new HBox(10);
layout.setStyle("-fx-padding: 10; -fx-background-color: cornsilk;");
layout.getChildren().addAll(adminPane, viewPane, connectivityPane);
layout.setPrefHeight(150);
layout.getStylesheets().add(this.getClass().getResource("titledpanecustomization.css").toExternalForm());
primaryStage.setScene(new Scene(layout));
primaryStage.show();
Node arrow = adminPane.lookup(".arrow");
arrow.setVisible(false);
arrow.setManaged(false);
// translate the titledpane arrow and header so that the arrow is displayed to right of the header.
Pane connectivityArrow = (Pane) connectivityPane.lookup(".arrow");
connectivityArrow.translateXProperty().bind(
connectivityPane.widthProperty().subtract(connectivityArrow.widthProperty().multiply(2))
);
Pane connectivityTitle = (Pane) connectivityPane.lookup(".header");
connectivityTitle.translateXProperty().bind(
connectivityArrow.widthProperty().negate()
);
}
}
还有一些CSS:
/** titledpanecustomization.css place in same build directory as TitledPaneCustomization.java
and ensure build system copies it to the output classpath. */
.admin .titled-pane > .title {
-fx-background-color: blue, yellow, linear-gradient(to bottom, derive(coral, +50%), coral);
}
.connectivity {
-fx-text-fill: white;
}
.nerrors {
-fx-background-color: derive(-fx-focus-color, -15%);
-fx-padding: 5 8 5 8;
-fx-text-fill: white;
}
.connectivityErrorLabel {
-fx-text-fill: white;
-fx-padding: 0 40 0 3;
}
.connectivity .titled-pane > .title {
-fx-background-color: -fx-box-border, -fx-inner-border, -fx-body-color;
-fx-background-insets: 0, 1, 2;
-fx-background-radius: 0 0 0 0, 0 0 0 0, 0 0 0 0;
-fx-padding: 0.166667em 1.166667em 0.25em 0; /* 2 14 3 0 */
-fx-color: -fx-focus-color;
}
.connectivity .titled-pane > .title > .arrow-button .arrow {
-fx-background-color: white;
}
关于java - 如何在 JavaFX 的 TitledPane 中更改 header 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11765436/
我在让“@header”或任何其他@规则在ANTLR中工作时遇到麻烦。具有非常基本的语法,如下所示: grammar test; options { language = CSharp2;
我对来源和寄宿有疑问 我有一个ajax页面“Page A”,它将称为ajax提要“Page B” 我看到来自ajax调用的“页面B”的请求 header 具有源“http://mydomain.com
我在 pandas 中使用了数据透视表并获得了所需的数据框格式,但现在我有两行标题。数据透视表后的结果数据框如下: scenario Actual Plan
我在 pandas 中使用了数据透视表并获得了所需的数据框格式,但现在我有两行标题。数据透视表后的结果数据框如下: scenario Actual Plan
我想在主机将它们发送到网络之前修改数据包头(IP 头、TCP 头)。 例如,如果我使用 firefox 进行浏览,那么我想拦截所有来自 firefox 的数据包并修改 IP/TCP header ,然
我的 header 内容被包装到#header 中,但是当我设置边框显示结构时,它显示我的#header 的内容出现在#header 本身之后。可能是什么问题?这是我的代码: #header { bo
我是一名 Web 开发人员,使用过 PHP 和 .NET。有一年多的 Web 工作经验,我一直无法彻底了解浏览器缓存功能,希望这里的 Web Gurus 可以帮助我。我心中的问题是: 浏览器实际上是如
伙计们,我有一个问题,我不知道如何在一个 header 中连接多个 header ,我们称它为“主 header ”并使用该 header 中的函数,例如 // A.h #include class
我有一个包含 SOAP 消息的 XMLHTTPRequest。 我想添加用于标识消息并将由 C# Web 服务使用的 guid。 GUID 的目标是识别特定用户,并应护送所有用户请求以在服务器上进行身
我一直在阅读粘性标题,这是我目前所发现的。第一个粘性 header 效果很好,但是当它遇到第一个 header 时,我如何向上滚动第一个 header 并使第二个 header 卡住? http://
我想将当前基于 TableView 的数据网格转换为新的 UICollectionView 类。 这就是我当前的网格的样子: 我的网格有两个标题: 年份(2006a、2007a 等)和 类型(“收入”
我目前正在使用 Apollo 服务器。我正在尝试在响应 header 中设置一个属性。并且此属性是从客户端 graphQL 请求 header 中检索的。 我在网上查了一下。并看到了诸如使用插件或扩展
我的 Controller 的方法需要设置一个标题,例如X-Authorization .创建新对象( store Action )后,我执行转发以显示新创建的对象( show Action ): $
我正在研究一些关于 VLAN 的事情,发现了 VLAN 标签 和 header 。 如果我们有标准 802.3 以太网帧 的 MTU(1518 字节), header 802.3 中包含什么? 另外,
我是放心和 Java 的新手,我正在尝试做一个非常基本的测试来检查 API 的响应是否为 200 ok。 谁能告诉我我需要在下面的脚本中更改什么才能传递多个 header Id、Key 和 ConId
在我的项目中,我需要知道 zlib header 是什么样的。我听说它相当简单,但我找不到 zlib header 的任何描述。 例如,它是否包含魔数(Magic Number)? 最佳答案 zlib
我正在使用 JMeter 测试 HTTP 服务器,该服务器接受并验证 APIKey 并在成功时返回一个有时限的 token 。如果我有 token ,我想发送一个 token ;如果没有,我想发送一个
以太网 header 是什么样的? 是吗: 1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|
我们的应用程序支持 CORS 配置 header 。我在两个不同的主机上分别配置了 testApp。两种设置都相互独立工作。host1 上的应用程序配置有 CORS header Access-Con
tlhelp32.h 不包含 windows.h 本身是有原因的吗?我一直在与大量的编译器错误作斗争,因为我在包含 tlhelp32.h 之后包含了 windows.h。这是设计决定还是出于什么原因?
我是一名优秀的程序员,十分优秀!