JavaFX:设置文本控件的背景颜色

2023-11-27

我正在使用 TextFlow 和一些文本项来显示样式文本,但我找不到一种方法来设置简单的背景颜色Text items.

我可以设置填充颜色和字体,但它没有设置其背景颜色的 java 方法或 css 属性。


基于此solution,这是一种为所有对象提供背景色的方法的快速实现Text内的节点FlowPane,使用 CSS 并能够设置一系列由 分隔的绘制值commas(尽可能Text项)以及其中每一项的插图:

private FlowPane flow;
private Scene scene;

@Override
public void start(Stage primaryStage) {
    Text text0 = new Text("These are several ");
    Text text1 = new Text("Text Nodes ");
    Text text2 = new Text("wrapped in ");
    Text text3 = new Text("a FlowPane");
    text0.setFill(Color.WHEAT);
    text0.setFont(new Font("Times New Roman", 20));
    text1.setFill(Color.WHITE);
    text1.setFont(new Font("Verdana", 32));
    text2.setFill(Color.WHITESMOKE);
    text2.setFont(new Font("Arial", 24));
    text3.setFill(Color.WHITESMOKE);
    text3.setFont(new Font("Arial", 18));

    flow = new FlowPane(text0, text1, text2, text3);
    scene = new Scene(flow, 300, 200);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();

    setBackgroundColors();
    flow.needsLayoutProperty().addListener((obs,d,d1)->setBackgroundColors());        
}

private void setBackgroundColors(){
    final Bounds out = flow.getBoundsInLocal();
    final StringBuilder sbColors = new StringBuilder();
    final StringBuilder sbInsets = new StringBuilder();
    AtomicInteger cont = new AtomicInteger();
    flow.getChildrenUnmodifiable().forEach(n->{
        sbColors.append("hsb(")
                .append((((double)cont.get())/((double)flow.getChildren().size()))*360d)
                .append(", 60%, 90%)");
        Bounds b = ((Text)n).getBoundsInParent();
        sbInsets.append(b.getMinY()).append(" ");
        sbInsets.append(Math.min(scene.getWidth(),out.getMaxX())-b.getMaxX()).append(" ");
        sbInsets.append(Math.min(scene.getHeight(),out.getMaxY())-b.getMaxY()).append(" ");
        sbInsets.append(b.getMinX());
        if(cont.getAndIncrement()<flow.getChildren().size()-1){
            sbColors.append(", ");
            sbInsets.append(", ");
        }
    });
    flow.setStyle("-fx-background-color: "+sbColors.toString()+"; -fx-background-insets: "+sbInsets.toString()+";");
}

这将导致:

Flow1

调整场景大小后:

Flow2

EDIT

基于使用的OP请求TextFlow布局而不是FlowPane, since Text节点可以跨越多条线TextFlow,给定的解决方案将不再有效,因为每个文本节点的边界框将与其他节点重叠。

作为解决方法,我们可以拆分Text单个单词中的节点Text节点,同时为相同原始短语中的节点保持相同的背景颜色。

我不会讨论分割逻辑,但我将添加一个索引列表,其中每个索引都将文本节点与其背景颜色索引进行映射。

private FlowPane flow;
private Scene scene;

private final List<Integer> indices=Arrays.asList(0,0,0,1,1,2,2,3,3);

@Override
public void start(Stage primaryStage) {
    List<Text> text0 = Arrays.asList(new Text("These "), new Text("are "), new Text("several "));
    List<Text> text1 = Arrays.asList(new Text("Text "), new Text("Nodes "));
    List<Text> text2 = Arrays.asList(new Text("wrapped "), new Text("in "));
    List<Text> text3 = Arrays.asList(new Text("a "), new Text("FlowPane"));
    text0.forEach(t->t.setFill(Color.WHEAT));
    text0.forEach(t->t.setFont(new Font("Times New Roman", 20)));
    text1.forEach(t->t.setFill(Color.WHITE));
    text1.forEach(t->t.setFont(new Font("Verdana", 32)));
    text2.forEach(t->t.setFill(Color.WHITESMOKE));
    text2.forEach(t->t.setFont(new Font("Arial", 24)));
    text3.forEach(t->t.setFill(Color.WHITESMOKE));
    text3.forEach(t->t.setFont(new Font("Arial", 18)));

    flow = new FlowPane();
    flow.getChildren().addAll(text0);
    flow.getChildren().addAll(text1);
    flow.getChildren().addAll(text2);
    flow.getChildren().addAll(text3);
    scene = new Scene(flow, 300, 200);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();

    setBackgroundColors();
    flow.needsLayoutProperty().addListener((obs,d,d1)->setBackgroundColors());        
}

private void setBackgroundColors(){
    final Bounds out = flow.getBoundsInLocal();
    final StringBuilder sbColors = new StringBuilder();
    final StringBuilder sbInsets = new StringBuilder();
    AtomicInteger cont = new AtomicInteger();
    flow.getChildrenUnmodifiable().forEach(n->{
        sbColors.append("hsb(")
                .append((double)indices.get(cont.get())/(double)(indices.get(flow.getChildren().size()-1)+1)*360d)
                .append(", 60%, 90%)");
        Bounds b = ((Text)n).getBoundsInParent();
        sbInsets.append(b.getMinY()).append(" ");
        sbInsets.append(Math.min(scene.getWidth(),out.getMaxX())-b.getMaxX()-1).append(" ");
        sbInsets.append(Math.min(scene.getHeight(),out.getMaxY())-b.getMaxY()).append(" ");
        sbInsets.append(b.getMinX());
        if(cont.getAndIncrement()<flow.getChildren().size()-1){
            sbColors.append(", ");
            sbInsets.append(", ");
        }
    });
    flow.setStyle("-fx-background-color: "+sbColors.toString()+"; -fx-background-insets: "+sbInsets.toString()+";");
}

This FlowPane现在表现为TextFlow:

Flow3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX:设置文本控件的背景颜色 的相关文章

  • 错误:无法初始化主类 FileChooser_1 原因:java.lang.NoClassDefFoundError:阶段 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在这里编写了以下代码 我无法运行该程序 并且不断出现下面提到的错误 我尝试了很多可能的解决方案 但都是徒劳 import java
  • 判断第一个字母是否是元音序言

    我习惯了过程式编程语言 而且我在 prolog 上遇到了一些困难 缺乏在线资源也是一个遗憾 获取给定变量的第一个字符并检查它是否是元音的最 序言 方式是什么 我想 这样的东西就是我所追求的 这都是伪代码 但这是你解决问题的方法吗 isVow
  • Jquery 检测选项卡导航的相同类和文本

    有谁有检测相同文本的经验 和班级 这是我当前的代码 ul nav li click function ul slideMove li fadeOut slow var sharedata this text ul slideMove li
  • 如何更改 Chromium 组件的默认背景颜色?

    I use TChromium http code google com p delphichromiumembedded 我分配AWebPageAsString这是一个带有灰色背景颜色的静态 HTML 页面 FBrowser TChrom
  • 我可以在 UITextView 中以编程方式选择文本吗?

    我想在 UITextView 上选择文本 类似于我们点击时看到的默认 选择 和 全选 弹出选项 我希望用户能够从我的自定义菜单中执行此操作 我玩了 selectedRange 但这似乎并没有解决问题 有任何想法吗 Thanks The se
  • 如何更改Android软键盘中任意键的按键背景

    我想让键盘上的一些键与其他键不同 例如下图中的shift 删除 空格键 根据google的参考文档 我们可以通过使用 来改变按键的背景android keybackground drawable xxx in input xml 但它改变了
  • JavaFX - 如何从另一个控制器使用一个控制器中的方法?

    使用场景构建器 我有 2 个阶段 每个阶段都有一个控制器 stage1Controller stage2Controller Stage1控制器 public class Stage1Controller FXML private Menu
  • 如何将 CSS 样式表附加到 FXML?

    遵循 Oracle 教程http docs oracle com javafx 2 get started fxml tutorial htm http docs oracle com javafx 2 get started fxml t
  • 如何在 CSS 中设置三角形蒙版的样式?

    我一直在研究如何使用 css 制作这个 逆三角形 背景 我指的是背景 固定 图像顶部底部的白色对角部分 我得到的最多的是形状 这显然不是一个好的解决方案 因为它是为了反应灵敏设计 我不在乎当窗口变窄时是否只有一条对角线 只要没有水平滚动即可
  • 如何显示数字键盘

    我阅读了其他几篇文章并使用 input setInputType TYPE NUMBER FLAG DECIMAL 确实打开了键盘 但不是数字键盘 这有什么技巧吗 give android inputType number 在你的 xml
  • docx 模板 Docx4j 替换 Java 中的文本

    我是 Docx4j 的新手 我的任务是替换 docx 模板的一些文本 我阅读了 docx4j 的入门指南 但我认为我没有完全理解整个概念 好吧 无论如何 我已经尝试过 Docx4j 的解压模板 1 它与给定的 docx 配合得很好 但是当我
  • 如何防止移动浏览器调整文本大小

    如何使文本在移动设备上的显示方式与在桌面设备上的显示方式相同 浅粉色区域中的文本在桌面和移动设备上是相同的 这正是我在 推荐 部分 以及许多其他领域 需要实现的目标 谢谢 Desktop view Mobile view CSS testi
  • JavaFX TabPane 禁用按键切换选项卡

    我有一个Tab有一些内容 ScrollBar和别的 The ScrollBar has event handler for keys left and right 但如果我按下这些按钮Tabs被切换 因为TabPane还有一个密钥处理程序
  • JavaFX 多线程 - 连接线程不会更新 UI

    我正在尝试创建一个加载程序对话框 用户可以在其中知道程序正在加载所请求的内容并且程序正在按预期运行 但正因为如此 我需要join 解析器线程和之前继续主线程 这使得对话框空白 解析器任务 java public class ParserTa
  • 将2个暗淡数组“列表列表”输出到python中的文本文件

    简单的问题 我正在创建一个两个暗淡的数组 ddist 0 d for in 0 d 在下面的代码中使用列表 它使用 gis 数据输出距离 我只是想要一种简单的方法来获取数组 列表的结果并将其输出到保持相同的 N N 结构的文本文件 我过去曾
  • 如何在 JavaFX 中对单选按钮的最大可选复选框进行限制?

    请看下面的图片 您就会了解我的应用程序的布局 我希望能够动态选择多少CheckBox 启用下拉菜单 是可选的 固定数量 我想用这 3 个人来实现这个目标RadioButton 在垂直模式下全部 4CheckBox必须选择 不少于 在混合模式
  • Mac OS X 下的 JavaFX:系统菜单和模态窗口

    我目前面临 Mac OS X 下的 JavaFX 菜单和模式对话框的问题 我正在使用该方法 MenuBar setUseSystemMenuBar true 为了将系统菜单栏用于我的应用程序菜单 这工作正常 但如果模式对话框打开 菜单不会被
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • Javafx 拖放 TabPane

    我 在 JavaFx 应用程序中 有一个带有不同选项卡的选项卡 我想实现拖放功能以将选项卡拖到舞台之外 这样它就可以生成一个新窗口 就像在 Google Chrome 中一样 谢谢您的帮助 您应该检查 Tom Schindl 在他的网站上显
  • jqgrid长文本换行

    在jqgrid中 我们从数据库获取长文本 但在JQgrid中显示时需要换行 有什么方法可以换行长文本 没有任何空格 我们只有 110px 的空间用于收款人姓名字段 因为我们有多个列需要显示 我们的代码就像 name firstPayeeNa

随机推荐

  • 用于在自连接表中的嵌套

    Please help me solve my big problem in my on line shopping project i created a dynamic Category List with Infinite Level
  • 搜索满足 Column1 <= X <= Column2 的行的 SQL 查询非常慢

    我正在使用 MySQL 数据库 并有下表 CREATE TABLE SomeTable PrimaryKeyCol BIGINT 20 NOT NULL A BIGINT 20 NOT NULL FirstX INT 11 NOT NULL
  • 所有事件驱动框架都应该是单线程的吗?

    http weblogs java net blog kgh archive 2004 10 multithreaded t html认为多线程 GUI 框架是一个失败的梦想 非 GUI 框架怎么样 这个经验法则是否适用于所有事件驱动框架
  • 应用程序启动器图标更改为 Oreo 上的默认图标

    我创建了一个带有自己的启动器图标的 Android 应用程序 它与牛轧糖配合得很好 但在 Oreo 中 我的图标被默认的 Android 图标取代 我已经定义了ic launcher png and ic launcher round pn
  • AutoMapper 与 ValueInjecter [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 Locked 这个问题及其
  • 将音频 MMS:// 流式传输到 iPhone

    我想直播mms url我的 iPhone 应用程序 但到目前为止 很难获得有关该主题的信息 我知道有几个应用程序已经可以做到这一点 FStream WunderRadio Tuner 并且我已经阅读了一些关于它们可能使用 libmms 和
  • 模板类C++

    我尝试为我的大学项目设计一个模板 我写了以下代码 ifndef LinkedList H define LinkedList H include Link h include
  • C++ 中的扩展方法

    我正在寻找 C 中扩展方法的实现 并发现了这个 comp std c 讨论其中提到polymorphic map可以用于将方法与类相关联 但是 提供的链接似乎已失效 有谁知道这个答案指的是什么 或者是否有另一种方法以与扩展方法类似的方式扩展
  • 乔恩·斯基特 (Jon Skeet) 的 Singleton 澄清

    public sealed class Singleton Singleton public static Singleton Instance get return Nested instance class Nested Explici
  • 等效的隐式运算符:为什么它们是合法的?

    Update 请参阅下面我对 C 规范的一部分的剖析 我想我一定错过了一些东西 因为me看起来我在这个问题中描述的行为实际上违反了规范 更新2 好吧 经过进一步思考 并根据一些评论 我想我现在明白发生了什么 规范中的 源类型 一词指的是正在
  • 迭代器上的 Scala 映射不会产生副作用

    为什么会这样 scala gt List 1 2 3 4 iterator map x Int gt println x 不打印出来 1 2 3 4 while List 1 2 3 4 map x Int gt println x Lis
  • 如何将系统麦克风音频流传输到连接设备麦克风音频流

    I am trying to attach USB device used for tele calling which have pnp sound controller for mic and speaker Now i have tw
  • Spring Boot with Security OAuth2 - 如何通过 Web 登录表单使用资源服务器?

    I have 春季启动 1 2 1 RELEASE 服务的应用程序OAuth2 2 0 6 RELEASE 授权和资源服务器位于一个应用程序实例中 它使用自定义UserDetailsService实现利用MongoTemplate在 Mon
  • Pandas:列的指数平滑函数

    我有以下包含交易数据的 DataFrame df pd DataFrame Trader Carl Mark Carl Joe Mark Carl Max Max split Quantity 5 2 5 10 1 5 2 1 Date D
  • Javascript 和反斜杠替换

    这是我的字符串 var str This is my string 这是我的代码 var replaced str replace 我无法让我的输出为 This is my string 我已经尝试了我能想到的正则表达式和替换值的所有组合
  • 在meteor.js 中处理发布数据的简单方法?

    我需要在我的meteor js 应用程序中处理一些POST 数据 有没有一种简单的方法可以做到这一点 非常基本 如果它是一个 PHP 应用程序 我只需要 POST 变量 流星路由器 https github com tmeasday met
  • 如何确定 Apache 运行时的用户和组?

    在 DreamHost 共享主机上 我正在设置 htpasswd 但 Apache 无权读取该文件 我如何授予它权限 我想更改所有者或组 htpasswd文件而不是授予它不安全的权限 我认为我无权访问httpd conf文件 所以我不能使用
  • 将 ResourceProcessor 迁移到 HATEOAS 1.0.0 M1

    在我当前的 Spring HATEOAS 0 25 1 RELEASE 项目中 我大量使用资源处理器接口 Bean public ResourceProcessor
  • 使用 chunksize 迭代获取推断的数据帧类型

    如何使用 pd read csv 迭代地对文件进行分块并 保留数据类型和其他元信息 就像我阅读了整个内容一样 一次数据集 我需要读取太大而无法装入内存的数据集 我想使用 pd read csv 导入文件 然后立即将块附加到 HDFStore
  • JavaFX:设置文本控件的背景颜色

    我正在使用 TextFlow 和一些文本项来显示样式文本 但我找不到一种方法来设置简单的背景颜色Text items 我可以设置填充颜色和字体 但它没有设置其背景颜色的 java 方法或 css 属性 基于此solution 这是一种为所有