在 JavaFX 中使用多个选择框来过滤列表视图

2024-01-22

我正在尝试使用多个选择框为我的列表视图创建一个过滤器函数,但我不知道如何做到这一点,因为我对 JavaFX 还很陌生。

我做了一些研究,听说需要使用过滤列表,但大多数在线示例仅围绕使用文本字段。

这是我的控制器类

@FXML
private ChoiceBox<String> genre;
@FXML
private ChoiceBox<String> branch;
@FXML
private ChoiceBox<String> status;
@FXML
private ChoiceBox<String> company;
@FXML
private ListView<Movie> listView;

private ObservableList<Movie> movieList = FXCollections.observableArrayList();
private FilteredList<Movie> filteredData = new FilteredList<>(movieList, s -> true);

public Controller()  {
        vehicleList.addAll(
                new Movie("Horror" ,"IT", ,"Branch1", "Released", "Warner Bros"),
                new Movie("Action","John Wick 3" ,"Branch2", "Coming Soon", "Summit Entertainment")
        );

@Override
public void initialize(URL location, ResourceBundle resources) {
//I am planning to implement the filter here in the initialize method
        listView.setItems(filteredData);
        listView.setCellFactory(movieListView -> new MovieListViewCell());
}

这是 MovieListViewCell 类

 @FXML
    private Label genre;

    @FXML
    private Label status;

    @FXML
    private GridPane gridPane;

    private FXMLLoader mLLoader;

    @Override
    protected void updateItem(Movie movie, boolean empty) {
        super.updateItem(vehicle, empty);

        if(empty || vehicle == null) {

            setText(null);
            setGraphic(null);

        } else {
            if (mLLoader == null) {
                mLLoader = new FXMLLoader(getClass().getResource("/application/ListCell.fxml"));
                mLLoader.setController(this);

                try {
                    mLLoader.load();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

            genre.setText(String.valueOf(vehicle.getMovie_Genre()));
            status.setText(String.valueOf(vehicle.getMovie_Status()));
            setText(null);
            setGraphic(gridPane);
        }

    }

这是我运行整个 UI 的主要方法

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            Parent root = FXMLLoader.load(getClass().getResource("/application/MainPage.fxml"));
            Scene scene = new Scene(root,800,650);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

这是我的 FXML 主布局 MainPage.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.String?>
<?import javafx.collections.FXCollections?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.ChoiceBox?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.Controller">
   <center>
      <AnchorPane prefHeight="374.0" prefWidth="262.0" BorderPane.alignment="CENTER">
         <children>
            <ListView fx:id="listView" layoutX="106.0" layoutY="93.0" prefHeight="374.4" prefWidth="400.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
         </children>
      </AnchorPane>
   </center>
   <top>
      <MenuBar BorderPane.alignment="CENTER">
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
              <MenuItem mnemonicParsing="false" text="Close" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Edit">
            <items>
              <MenuItem mnemonicParsing="false" text="Delete" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Help">
            <items>
              <MenuItem mnemonicParsing="false" text="About" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
   </top>
   <left>
      <VBox alignment="CENTER" prefHeight="368.0" prefWidth="149.0" BorderPane.alignment="CENTER">
         <children>
            <TextField fx:id="filterField" />
            <ChoiceBox fx:id="type" prefWidth="150.0">
                 <items>
                    <FXCollections fx:factory="observableArrayList">
                        <String fx:value="Horror" />
                        <String fx:value="Action" />
                    </FXCollections>
                 </items>
               <VBox.margin>
                  <Insets bottom="20.0" left="10.0" right="10.0" />
               </VBox.margin>
            </ChoiceBox>
            <ChoiceBox fx:id="branch" prefWidth="150.0">
                <items>
                    <FXCollections fx:factory="observableArrayList">
                        <String fx:value="branch1" />
                        <String fx:value="branch2" />
                        <String fx:value="branch3" />
                    </FXCollections>
                 </items>
               <VBox.margin>
                  <Insets bottom="20.0" left="10.0" right="10.0" />
               </VBox.margin>
            </ChoiceBox>
            <ChoiceBox fx:id="company" prefWidth="150.0">
                <items>
                    <FXCollections fx:factory="observableArrayList">
                        <String fx:value="Warner Bros" />
                        <String fx:value="Summit Entertainment" />
                    </FXCollections>
                 </items>
               <VBox.margin>
                  <Insets bottom="20.0" left="10.0" right="10.0" />
               </VBox.margin>
            </ChoiceBox>
            <ChoiceBox fx:id="status" prefWidth="150.0">
                <items>
                    <FXCollections fx:factory="observableArrayList">
                        <String fx:value="Released" />
                        <String fx:value="Coming Soon" />
                    </FXCollections>
                 </items>
               <VBox.margin>
                  <Insets left="10.0" right="10.0" />
               </VBox.margin>
            </ChoiceBox>
         </children>
      </VBox>
   </left>
</BorderPane>

这是ListCell.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>

<GridPane fx:id="gridPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="206.0" prefWidth="534.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
    <columnConstraints>
      <ColumnConstraints halignment="CENTER" hgrow="SOMETIMES" maxWidth="350.0" minWidth="0.0" prefWidth="284.0" />
        <ColumnConstraints hgrow="SOMETIMES" maxWidth="509.0" minWidth="0.0" prefWidth="56.0" />
        <ColumnConstraints hgrow="SOMETIMES" maxWidth="543.0" minWidth="10.0" prefWidth="55.0" />
      <ColumnConstraints hgrow="SOMETIMES" maxWidth="543.0" minWidth="10.0" prefWidth="119.0" />
    </columnConstraints>
    <rowConstraints>
        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
    </rowConstraints>
    <children>
      <VBox alignment="CENTER" prefHeight="200.0" prefWidth="100.0">
         <children>
            <ImageView fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true">
               <image>
                  <Image url="@../../../../Desktop/Test.jpg" />
               </image>
            </ImageView>
         </children>
      </VBox>
      <VBox alignment="CENTER" prefHeight="212.0" prefWidth="95.0" GridPane.columnIndex="1">
         <children>
            <Label text="Genre:" />
            <Label text="Status:" />
         </children>
      </VBox>
      <VBox alignment="CENTER" prefHeight="183.0" prefWidth="80.0" GridPane.columnIndex="2">
         <children>
            <Label fx:id="genre" text="Label" />
            <Label fx:id="status" text="Label" />
         </children>
      </VBox>
      <VBox alignment="CENTER" prefHeight="225.0" prefWidth="132.0" GridPane.columnIndex="3">
         <children>
            <Button mnemonicParsing="false" text="Button" />
         </children>
      </VBox>
    </children>
</GridPane>

希望有人能为我提供任何解决方案。谢谢


Using a FilteredList如果您想过滤内存中的项目,这是正确的方法。如果你看一下文档 https://openjfx.io/javadoc/12/javafx.base/javafx/collections/transformation/FilteredList.html,你会看到FilteredList has a predicate财产。不出所料,该房产拥有Predicate https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/function/Predicate.html. The Predicate接口是一个功能接口(这意味着它可以是 lambda 表达式或方法引用的目标)其抽象方法接受类型的泛型参数T并返回true or false基于任意逻辑。当您设置predicate的财产FilteredList,它将使用Predicate判断源中是否存在元素ObservableList应该可以通过FilteredList view。随着项目从源中添加和删除ObservableList the FilteredList会自动更新。

不幸的是,如果您更新任何状态Predicate是基于(例如,在ChoiceBoxes) 它不会自动重新应用Predicate关于源的所有元素ObservableList。换句话说,FilteredList不会自动更新,只是因为Predicate的内部状态发生了变化。这意味着每次更新过滤器状态时,您都需要创建一个new Predicate并设置predicate的财产FilteredList。这是创建和使用绑定会有所帮助的地方。 (注意:虽然Callable是的一部分java.util.concurrent包,这里没有并发发生。)

为了创建绑定,我们将使用Bindings.createObjectBinding(Callable,Observable...) https://openjfx.io/javadoc/12/javafx.base/javafx/beans/binding/Bindings.html#createObjectBinding(java.util.concurrent.Callable,javafx.beans.Observable...)。该方法接受一个Callable https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/concurrent/Callable.html(其他功能接口)和一个数组Observable对象。的数组Observables 被称为依赖关系所创造的ObjectBinding并且,当其中任何一个无效时,会导致ObjectBinding根据给定的值重新计算其值Callable。换句话说,Callable每当其中之一被调用Observables 无效。

FilteredList<Movie> filteredList = movieList.filtered(null); // a null Predicate means "always true"

// moved to own variable for clarity (usually inlined with the method call)
Observable[] dependencies = {genre.valueProperty(), branch.valueProperty(), status.valueProperty(), company.valueProperty()};

ObjectBinding<Predicate<Movie>> binding = Bindings.createObjectBinding(() -> {
    Predicate<Movie> predicate = movie -> {
        // test "movie" based on the values of your ChoiceBoxes
    };
    return predicate;
}, dependencies);

filteredList.predicateProperty().bind(binding);

如果您注意到的话,依赖项是value https://openjfx.io/javadoc/12/javafx.controls/javafx/scene/control/ChoiceBox.html#valueProperty你的每一个的属性ChoiceBoxes.属性(即实例ReadOnlyProperty and Property)是以下的实现Observable当它们的值可能改变时,它们就会失效。这意味着每当用户改变他们的选择时,value财产无效,并且Predicate of the FilteredList被改变了。当。。。的时候Predicate更改列表被“重新过滤”。

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

在 JavaFX 中使用多个选择框来过滤列表视图 的相关文章

  • 在Java中将*s打印为三角形?

    我在 Java 课程中的作业是制作 3 个三角形 一份左对齐 一份右对齐 一份居中 我必须为什么类型的三角形制作一个菜单 然后输入需要多少行 三角形必须看起来像这样 到目前为止 我能够完成左对齐的三角形 但我似乎无法获得其他两个 我尝试用谷
  • ScheduledThreadPoolExecutor如何在特定时间运行任务?

    特别是 它是否像这样在内部实现了 while true 循环 while System currentTimeMillis lt timeToRunTask Thread sleep 1000 doTask From http grepco
  • 项目缺少所需的注释处理库

    我的 Eclipse IDE 突然在问题视图中显示 xxxx 项目缺少所需的注释处理库 xxxx M2 REPO 中的一些旧 jar 我用谷歌搜索 没有找到任何答案 为什么我的项目使用旧的 jar 以及错误来自哪里 To remove th
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • OpenNLP 与斯坦福 CoreNLP

    我一直在对这两个包进行一些比较 但不确定该往哪个方向走 我简单地寻找的是 命名实体识别 人 地点 组织等 性别识别 一个不错的训练 API 据我所知 OpenNLP 和斯坦福 CoreNLP 提供了非常相似的功能 然而 Stanford C
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • 是否有最新的 Facebook Java SDK? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 好像没找到最近更新的 如果没有 是否有一个好的 Java 库来执行与 Facebook 的 API 交
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • Java 中处理异步响应的设计模式

    我读过类似问答的答案 如何在 JAVA 中创建异步 HTTP 请求 https stackoverflow com questions 3142915 how do you create an asynchronous http reque
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • Java:一个函数有多种返回类型...可以使用泛型吗?

    为了简单起见 我有一些程序 如下所示 public String fetchValueAsString String key public DateTime fetchValueAsDateTime String key 我想要类似的东西
  • Java String ReplaceAll 方法给出非法重复错误?

    我有一个字符串 当我尝试运行时replaceAll方法 我收到这个奇怪的错误 String str something op str str replaceAll o n it works fine str str replaceAll n
  • android 中的 java.net.URL ..新手问题

    我是java新手 正在尝试android开发 以下代码生成 malformedURLException 有人可以帮助我识别异常吗 任何提示都会非常有帮助 package com example helloandroid import and
  • JPA 将 BigDecimal 作为整数保存在数据库中

    我在数据库中有这个字段 ITEMCOST NUMERIC 13 DEFAULT 0 NOT NULL 在JAVA中 Entity中的字段定义如下 Column name ITEMCOST private BigDecimal itemCos
  • java中的预增量/后增量

    有人可以帮助我理解为什么 int i 1 int j 1 int k 1 int l 1 System out println i i System out println j j System out println k k System
  • Jackson 反序列化相当于 @JsonUnwrapped 吗?

    假设我有以下课程 public class Parent public int age JsonUnwrapped public Name name 生成 JSON age 18 first Joey last Sixpack 我如何将其反
  • java.lang.ClassCastException:com.sun.proxy.$Proxy8 无法转换为 org.openqa.selenium.internal.WrapsDriver

    我有以下切入点和 AspectJ 中给出的建议 Pointcut call org openqa selenium WebElement sendKeys public void onWebElementAction After onWeb
  • @Embeddable 中的 @GenerateValue

    我已将实体的 id 分离到一个单独的 Embeddable 类中 该实体如下 Entity Table name users public class Users EmbeddedId private Users pk id private
  • 你能快速告诉我这个伪代码是否有意义吗?

    我相信我的代码现在是万无一失的 我现在将写出伪代码 但我确实有一个问题 为什么 DRJava 要求我返回 if 语句之外的内容 正如你所看到的 我为 ex 写了 return 1 只是因为它问了 但是它永远不会返回该值 谁可以给我解释一下这

随机推荐

  • 在 Bash 中如何查看字符串是否不在数组中?

    我试图在不添加额外代码 例如另一个 for 循环 的情况下执行此操作 我可以创建将字符串与数组进行比较的正逻辑 虽然我想要负逻辑并且只打印不在数组中的值 但本质上这是为了过滤掉系统帐户 我的目录中有这样的文件 admin user xml
  • SWIG 和 Python3 导入错误

    我用 C 编写了一个库 我使用SWIG http swig org为 Java Python 等生成绑定 我设法为这两种语言编写自定义类型映射等等 我还设法使用我的库 自定义协议 并与我用 C 编写的服务器 我用 Java 编写的客户端以及
  • 部署 Perl 应用程序

    部署 Perl 应用程序的最佳实践是什么 假设您正在部署到安装了少量 CPAN 模块的普通盒子上 理想的构建 部署方法是什么 Module Build ExtUtils MakeMaker 其他 我正在从那些针对大型应用程序重复执行此操作的
  • 如何使用 Office 2010 调试 Office 2007-addin

    我想开发一个适用于 Word 2007 和 Word 2010 的 Word 插件 因此 我在 Visual Studio 中创建了一个 Word 2007 插件项目 我的机器上 仅 安装了 Word 2010 当我尝试从 Visual S
  • 如何访问vagrant box laravel/homestead中的特定端口?

    我正在我的 vagrant laravel homestead 盒子上开发一个节点项目 一切正常 当我转到我的主机定义时 我可以访问该项目 etc hosts 192 168 10 10 project 但是 我正在尝试使用 webpack
  • android 是否可以在来电或去电时录制通话

    在android中 可以在不打开手机扬声器的情况下在来电 去电期间录制语音通话 我在android市场上看到过一个应用程序 由于它使用麦克风进行录音 因此在不打开扬声器的情况下无法正确记录对方的声音 可以通过其他技术来完成吗 final M
  • 从两个不同的脚本写入和读取 fifo

    我有两个 bash 脚本 一个脚本写入 fifo 第二个从 fifo 读取 但在第一个结束之后写入 但有些东西不起作用 我不明白问题出在哪里 这是代码 第一个脚本是 作者 bin bash fifo name myfifo Se non e
  • Git 将文件添加到存储库

    我遵循基本的 Git 教程并添加了 README 文件 效果很好 然后我将项目文件复制到同一文件夹并尝试通过运行将它们添加到存储库 git add all git ci test my alias for commit git push o
  • git 项目的 Eclipse 设置

    关于这个话题有很多问题 但目前还没有令人满意的答案 例如this https stackoverflow com questions 8820668 the current branch is not configured for pull
  • ARM Data Abort错误异常调试

    所以现在我明白我遇到了 ARM 数据中止异常 我了解了如何捕获异常本身 STL 库中的错误地址 但我想在异常之前返回堆栈帧 我正在使用 IAR 工具链 它告诉我异常后调用堆栈不可用 有没有一种技巧可以说服工具向我显示调用堆栈 感谢您的快速帮
  • 滚动窗口重访 - 添加窗口滚动数量作为参数 - 向前分析

    我一直在网上搜索可以创建的方法滚动窗户这样我就可以以通用的方式对时间序列执行称为前向分析的交叉验证技术 然而 我还没有找到任何在 1 窗口大小方面具有灵活性的解决方案 几乎所有方法都有这个 例如 pandas rolling https p
  • 拖动选项卡以将其置于前面

    我正在将数据从应用程序外部拖到 TabControl 上 我希望能够拖动 选项卡 并将该选项卡带到前面 TabControl 和 TabItems 上的拖动事件似乎仅针对活动选项卡触发 并且仅在拖动选项卡内容而不是 选项卡 本身时触发 该控
  • 增加图形库和访问者

    我正在编写一个用于操作键图的库 并且我正在使用 Boost Graph Library 来存储数据 不幸的是 我似乎无法弄清楚如何使用它来实现正确的访问者模式 因为您无法对顶点进行子类化 您必须依赖 属性 库中提供的访问者框架似乎非常适合使
  • 如何通过电子邮件向某人发送 git 存储库?

    我努力了 git archive HEAD format zip gt archive zip 然后我通过电子邮件发送 archive zip 在另一端他们将 archive zip 解压缩到一个文件夹中 但是当他们尝试任何 git 命令时
  • 从 DataTemplate UWP 绑定 UserControl DP

    我有一个FlipView这表明雕像 雕像包含一个Path到他们的形象 将此属性绑定到常规 DataTemplate 就可以了 下面的代码工作正常
  • 指向页面部分的锚链接在浏览器刷新、后退和前进时不起作用

    我制作了一个 html 页面 页面内有链接 div a href first first a a href second second a div First div div div Second div div div 但此代码不适用于页
  • 如何配置 rhino 为 angularjs 控制器运行 jasmine 测试

    我在使用 Jasmine sbt 插件为 Angular JS 应用程序进行单元测试时遇到问题 当我将 angular js 版本 1 3 1 添加到 test dependency js 时 EnvJasmine loadGlobal E
  • F# printfn 异常

    任何人都可以解释为什么这会导致错误 let xs Mary Mungo Midge Array iter printfn xs 虽然这不会 Array iter printfn Mary Mungo Midge printfn 的签名是Pr
  • 如何让 Django 将调试信息打印到控制台?

    我使用 urllib 来访问我的应用程序而不是浏览器 因此发生错误时我看不到调试屏幕 将正常调试信息发送到控制台或文件的最佳方法是什么 编辑 我已经捕获了页面的输出 但是当我将其打印到屏幕上时 它充满了大量无用的 html 我可以得到错误吗
  • 在 JavaFX 中使用多个选择框来过滤列表视图

    我正在尝试使用多个选择框为我的列表视图创建一个过滤器函数 但我不知道如何做到这一点 因为我对 JavaFX 还很陌生 我做了一些研究 听说需要使用过滤列表 但大多数在线示例仅围绕使用文本字段 这是我的控制器类 FXML private Ch