在 JavaFX 中实现标签栏

2023-12-24

答案示范:(5月29日凌晨3点10分回答)

**10/7/2016** you can find the code on GitHub https://github.com/goxr3plus/JavaFX-TagsBar

回答前的实际问题:(5月22日19:53提问)

标题可能不太好,但我想要在 JavaFX 中做这样的事情:

Examples

YouTube:

StackOverFlow(具有自动完成功能):

问题:我不需要为此编写代码。相反,我想知道如何使用 JavaFX 和一些想法来实现这一目标。


对于标签,您可以使用自定义样式HBox含有一个Text(标签名称)节点 an aButton(删除按钮 (X))。通过调整背景和边框,您可以获得所需的标签外观。

The onAction按钮的处理程序应该从其父级中删除标签...

对于整个标签栏,您可以使用另一个HBox。使用适当的边框以获得正确的外观。除了标签之外,还添加一个TextField没有背景作为最后一个元素并设置Hgrow那的财产TextField to Priotity.ALWAYS以覆盖剩余的可用空间。

The onAction这个的处理程序TextField添加新标签并清除内容TextField.

你可以例如使用 ControlsFX 自动完成功能TextField或者自己实现它以获得自定义外观......

public class TagBar extends HBox {

    private final ObservableList<String> tags;
    private final TextField inputTextField;

    public ObservableList<String> getTags() {
        return tags;
    }

    public TagBar() {
        getStyleClass().setAll("tag-bar");
        getStylesheets().add(getClass().getResource("style.css").toExternalForm());
        tags = FXCollections.observableArrayList();
        inputTextField = new TextField();
        inputTextField.setOnAction(evt -> {
            String text = inputTextField.getText();
            if (!text.isEmpty() && !tags.contains(text)) {
                tags.add(text);
                inputTextField.clear();
            }
        });

        inputTextField.prefHeightProperty().bind(this.heightProperty());
        HBox.setHgrow(inputTextField, Priority.ALWAYS);
        inputTextField.setBackground(null);

        tags.addListener((ListChangeListener.Change<? extends String> change) -> {
            while (change.next()) {
                if (change.wasPermutated()) {
                    ArrayList<Node> newSublist = new ArrayList<>(change.getTo() - change.getFrom());
                    for (int i = change.getFrom(), end = change.getTo(); i < end; i++) {
                        newSublist.add(null);
                    }
                    for (int i = change.getFrom(), end = change.getTo(); i < end; i++) {
                        newSublist.set(change.getPermutation(i), getChildren().get(i));
                    }
                    getChildren().subList(change.getFrom(), change.getTo()).clear();
                    getChildren().addAll(change.getFrom(), newSublist);
                } else {
                    if (change.wasRemoved()) {
                        getChildren().subList(change.getFrom(), change.getFrom() + change.getRemovedSize()).clear();
                    }
                    if (change.wasAdded()) {
                        getChildren().addAll(change.getFrom(), change.getAddedSubList().stream().map(Tag::new).collect(Collectors.toList()));
                    }
                }
            }
        });
        getChildren().add(inputTextField);
    }

    private class Tag extends HBox {

        public Tag(String tag) {
            getStyleClass().setAll("tag");
            Button removeButton = new Button("X");
            removeButton.setOnAction((evt) -> tags.remove(tag));
            Text text = new Text(tag);
            HBox.setMargin(text, new Insets(0, 0, 0, 5));
            getChildren().addAll(text, removeButton);
        }
    }

}

样式.css

.tag-bar {
    -fx-border-color: blue;
    -fx-spacing: 3;
    -fx-padding: 3;
    -fx-max-height: 30;
}

.tag-bar .tag {
    -fx-background-color: lightblue;
    -fx-alignment: center;
}

.tag-bar .tag .button {
    -fx-background-color: transparent;
}
@Override
public void start(Stage primaryStage) {
    Button btn = new Button("Sort");

    StackPane.setAlignment(btn, Pos.BOTTOM_CENTER);

    TagBar tagBar = new TagBar();

    btn.setOnAction((ActionEvent event) -> {
        FXCollections.sort(tagBar.getTags());
    });

    Button btn2 = new Button("add \"42\"");
    btn2.setOnAction(evt -> {
        if (!tagBar.getTags().contains("42")) {
            tagBar.getTags().add("42");
        }
    });

    VBox root = new VBox();
    root.getChildren().addAll(tagBar, btn, btn2);
    root.setPrefSize(300, 400);

    Scene scene = new Scene(root);

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

在 JavaFX 中实现标签栏 的相关文章

  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 访问表达式主体成员以构建表达式树

    尝试使用表达式树按表达式构建订单 但我无法访问查询结果类的表达式主体属性 这是类结构 public class AssetFileRecord IAuditable IEntity INavigateToCustomValues publi
  • 我可以在 CouchDB 中进行事务和锁定吗?

    我需要执行事务 开始 提交或回滚 锁定 选择更新 我怎样才能在文档模型数据库中做到这一点 Edit 案例是这样的 我想经营一个拍卖网站 我还想如何直接购买 在直接购买中 我必须减少项目记录中的数量字段 但前提是数量大于零 这就是为什么我需要
  • 在 O(nlog(n)) 中查找“最大”重叠间隔对

    问题陈述 Inputn 个间隔的集合 s 1 t 1 s 2 t 2 s n t n Output一对间隔 s i t i s j t j 其中maximum所有区间对之间重叠 Example 输入区间 1 10 2 6 3 15 5 9
  • 如何为“扩展类”编写有意义的测试?

    编写有意义的测试的正确方法是什么扩展一个类 https dart dev guides language language tour extending a class与super关键词 class FooBase
  • Android 相机 takePicture 使用预览小缓冲区

    我正在使用 OPENCV 开发一个项目 我在 onCameraFrame 上有一些进程 当它显示预览时 用户可以拍照 但在某些设备中 我在调用 takePicture 方法后出现错误 我应该怎么办 E Camera JNI 11783 Ma
  • 我如何知道短信是否已到达 Twilio 中的目的地

    我正在开发一个网络应用程序 并且我正在使用 twilio 网关发送短信 我需要在我的页面上显示短信的状态 如果短信已发送 那么它将显示已发送 否则它将显示待处理 所以请告诉我如何知道消息是否已送达 以下是示例代码 public class
  • 如何提供一个后备程序集而不是无法加载的程序集?

    在运行时 如果引用的程序集无法加载 例如 强名称验证失败 因为它是测试签名的 有没有办法从另一个真实签名的路径提供替换程序集 我尝试订阅 AppDomain CurrentDomain AssemblyResolve 但它没有被触发 因为
  • 如何在Python 3中将二进制文件转换为列表中的文本文件?

    我正在尝试编写一个 Python 程序 该程序从 LabView 中获取多个二进制文件 从 tkinter 对话框中选择并打开 并将它们转换为可读的文本文件 或 csv 文件 理想情况下 但是 我在二进制到文本转换方面遇到了麻烦 我尝试查看
  • 如何快速比较颜色

    我正在尝试比较颜色 但无法使用isEqual方法 因为我正在尝试比较背景的颜色UICollectionViewCell 在这种情况下比较颜色的正确方法是什么 if cell layer backgroundColor UIColor red
  • 显示旋转轮图像直到整个页面加载

    我正在使用下面的代码 在布局页面的 body 标签内 div img src images user profile ajax loading gif alt Loading div 在起始页中 css div loading height
  • 如何使用 C++ 更改、替换或删除文本文件中的行?

    如何使用 C 更改 替换或删除文本文件中的行 我有一个文本文件 其中包含用户的登录信息 用户名和密码 例如 file Jimmy jim1236 tom tommy545 现在我怎样才能编写一个程序 允许用户在登录系统后更改自己的密码呢 我
  • 使用 csv.reader 的制表符分隔文件未分隔我期望的位置

    我正在尝试使用 Python 循环遍历选举结果的制表符分隔文件 以下代码不起作用 但是当我使用具有相同结果的本地文件 注释掉的行 时 它确实按预期工作 我唯一能想到的是我需要传递网址的一些标头或内容类型 但我无法弄清楚 为什么会发生这种情况
  • 获取 Google BigQuery 中给定月份的总天数?

    我可以创造用户定义函数 https cloud google com bigquery user defined functions并计算给定月份的总天数 有没有直接的方法来获取给定日期的给定月份中的总天数 eg select date t
  • 使用 PIL 时释放内存

    我正在使用 PIL Python 图像库 编辑图像 每一步 转换 旋转 调整大小 都会创建更多图像 文档摘录 返回旋转给定度数的图像的副本 所以我想释放内存 你知道下面的做法是否节省内存 import PIL Image image PIL
  • Socket.io 在两个 Node.js 应用程序之间触发事件?

    我有两台服务器 一台用于后端应用程序 另一台为前端服务 它们是抽象的 但共享相同的数据库 我需要两者使用 socket io 在彼此之间进行实时事件通信 前端 serves a front end website var appPort 9
  • 如何在列上添加隐藏属性?

    创建时态表时 我们需要定义开始和结束日期时间列 这可以是hidden 不可见于SELECT or INSERT without columns 我想再添加一列 其中包含有关已提交更改的用户的信息 问题是 我收到以下错误 Msg 13735
  • 避免在 selenium 调用期间打开远程服务器上的浏览器

    我使用 webdriver 编写了一个 Selenium 应用程序 我希望在远程服务器上运行它 当我通过 putty 以及 Xming 登录服务器来做到这一点时 selenium 会尝试仅在服务器上打开浏览器并通过外部显示器加载页面 然而
  • 使用 lucene 提取 tf-idf 向量

    我已经使用 lucene 索引了一组文档 我还为每个文档内容存储了 DocumentTermVector 我编写了一个程序并获取每个文档的词频向量 但是如何获取每个文档的 tf idf 向量 这是我的代码 用于输出每个文档中的术语频率 Di
  • 传递箭头函数与传递函数

    假设我有一个函数 handleChange e gt this setState e target id e target value 以下内容有什么区别 1
  • 在 JavaFX 中实现标签栏

    答案示范 5月29日凌晨3点10分回答 10 7 2016 you can find the code on GitHub https github com goxr3plus JavaFX TagsBar 回答前的实际问题 5月22日19