`

JavaFX学习 过滤table中的数据

阅读更多
   分享中的代码,大多是借鉴或者直接从别人源码中拿过来的,大家一起分享下。

在表中实现数据过滤,他的代码很简单。有2个datalist,一个用于保存原始数据,另一个实时数据。监听text里面内容,每次从原始数据中获得想要的数据放入实时中。
  
   
package customUI.filterDataInTable;

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class MainApp extends Application {
	  
	  @Override
	  public void start(Stage primaryStage) {
	      primaryStage.setTitle("Table Filtering");
	      
	      try {
	          FXMLLoader loader = new FXMLLoader(MainApp.class.getResource("PersonTable.fxml"));
	          AnchorPane page = (AnchorPane) loader.load();
	          Scene scene = new Scene(page);
	          primaryStage.setScene(scene);
	          primaryStage.show();
	      } catch (IOException e) {
	          System.err.println("Error loading PersonTable.fxml!");
	          e.printStackTrace();
	      }
	  }
	  
	  public static void main(String[] args) {
	      launch(args);
	  }
	}
   


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

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<?import jfxtras.labs.scene.control.*?>

<AnchorPane minWidth="315.0" prefHeight="300.0" prefWidth="315.0" xmlns:fx="http://javafx.com/fxml" fx:controller="customUI.filterDataInTable.PersonTableController">
  <children>
    <TableView fx:id="personTable" prefHeight="-1.0" prefWidth="-1.0" tableMenuButtonVisible="false" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="40.0">
      <columns>
        <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="120.0" text="First Name" fx:id="firstNameColumn" />
        <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="120.0" text="Last Name" fx:id="lastNameColumn" />
      </columns>
    </TableView>
    <HBox id="HBox" alignment="CENTER" spacing="5.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="10.0">
      <children>
        <Label text="Filter Table:" />
        <TextField fx:id="filterField" prefWidth="-1.0" HBox.hgrow="ALWAYS" />
      </children>
    </HBox>
  </children>
</AnchorPane>



package customUI.filterDataInTable;

public class Person {
	  private String firstName;
	  private String lastName;

	  public Person(String firstName, String lastName) {
	      this.firstName = firstName;
	      this.lastName = lastName;
	  }
	  
	  public String getFirstName() {
	      return firstName;
	  }

	  public void setFirstName(String firstName) {
	      this.firstName = firstName;
	  }

	  public String getLastName() {
	      return lastName;
	  }

	  public void setLastName(String lastName) {
	      this.lastName = lastName;
	  }

}



package customUI.filterDataInTable;

import java.util.ArrayList;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;

public class PersonTableController {
	 @FXML
	  private TextField filterField;
	  @FXML
	  private TableView<Person> personTable;
	  @FXML
	  private TableColumn<Person, String> firstNameColumn;
	  @FXML
	  private TableColumn<Person, String> lastNameColumn;
	  
	  private ObservableList<Person> masterData = FXCollections.observableArrayList();
	  private ObservableList<Person> filteredData = FXCollections.observableArrayList();
	  
	  /**
	  * The constructor. The constructor is called before the initialize()
	  * method.
	  */
	  public PersonTableController() {
	      // Add some sample data to the master data
	      masterData.add(new Person("Hans", "Muster"));
	      masterData.add(new Person("Ruth", "Mueller"));
	      masterData.add(new Person("Heinz", "Kurz"));
	      masterData.add(new Person("Cornelia", "Meier"));
	      masterData.add(new Person("Werner", "Meyer"));
	      masterData.add(new Person("Lydia", "Kunz"));
	      masterData.add(new Person("Anna", "Best"));
	      masterData.add(new Person("Stefan", "Meier"));
	      masterData.add(new Person("Martin", "Mueller"));
	      
	      // Initially add all data to filtered data
	      filteredData.addAll(masterData);
	      
	      // Listen for changes in master data.
	      // Whenever the master data changes we must also update the filtered data.
	      masterData.addListener(new ListChangeListener<Person>() {
	          @Override
	          public void onChanged(ListChangeListener.Change<? extends Person> change) {
	              updateFilteredData();
	          }
	      });
	  }

	  /**
	  * Initializes the controller class. This method is automatically called
	  * after the fxml file has been loaded.
	  */
	  @FXML
	  private void initialize() {
	      // Initialize the person table
	      firstNameColumn.setCellValueFactory(
	              new PropertyValueFactory<Person, String>("firstName"));
	      lastNameColumn.setCellValueFactory(
	              new PropertyValueFactory<Person, String>("lastName"));
	      
	      // Add filtered data to the table
	      personTable.setItems(filteredData);

	      // Listen for text changes in the filter text field
	      filterField.textProperty().addListener(new ChangeListener<String>() {
	          @Override
	          public void changed(ObservableValue<? extends String> observable,
	                  String oldValue, String newValue) {
	              
	              updateFilteredData();
	          }
	      });
	  }
	  
	  /**
	  * Updates the filteredData to contain all data from the masterData that
	  * matches the current filter.
	  */
	  private void updateFilteredData() {
	      filteredData.clear();
	          
	      for (Person p : masterData) {
	          if (matchesFilter(p)) {
	              filteredData.add(p);
	          }
	      }
	      
	      // Must re-sort table after items changed
	      reapplyTableSortOrder();
	  }

	  /**
	  * Returns true if the person matches the current filter. Lower/Upper case
	  * is ignored.
	  * 
	  * @param person
	  * @return
	  */
	  private boolean matchesFilter(Person person) {
	      String filterString = filterField.getText();
	      if (filterString == null || filterString.isEmpty()) {
	          // No filter --> Add all.
	          return true;
	      }
	      
	      String lowerCaseFilterString = filterString.toLowerCase();
	      
	      if (person.getFirstName().toLowerCase().indexOf(lowerCaseFilterString) != -1) {
	          return true;
	      } else if (person.getLastName().toLowerCase().indexOf(lowerCaseFilterString) != -1) {
	          return true;
	      }
	      
	      return false; // Does not match
	  }
	  
	  private void reapplyTableSortOrder() {
	      ArrayList<TableColumn<Person, ?>> sortOrder = new ArrayList(personTable.getSortOrder());
	      personTable.getSortOrder().clear();
	      personTable.getSortOrder().addAll(sortOrder);
	  }
	}
分享到:
评论

相关推荐

    JavaFX+Jfoenix 学习笔记(三)--TableView数据表格源码

    在"JavaFX+Jfoenix 学习笔记(三)--TableView数据表格源码"中,我们将重点讨论如何使用JavaFX的TableView组件结合JFoenix来展示和操作数据。TableView是JavaFX中的一个核心组件,它允许用户以表格的形式查看和操作...

    基于JavaFx TableView的人员增删查改界面

    在JavaFX中,TableView是一个强大的组件,用于展示和操作数据集。这个教程或者项目"基于JavaFx TableView的人员增删查改界面"旨在教你如何利用JavaFX构建一个用户界面,该界面可以对人员数据进行基本的操作,如添加...

    JavaFx中的表格

    在JavaFX中,表格是一种强大的可视化组件,用于展示和操作数据。这个压缩包包含了一些关键的源码文件,如`CustomerTable.fx`、`Cell.fx`和`HeaderCell.fx`,它们是构建JavaFX表格应用的核心部分。让我们深入探讨这些...

    javafx 2.0 tableview 实例

    总之,这个"javafx 2.0 tableview 实例"涵盖了JavaFX中数据展示的核心部分,是学习和理解TableView功能的好起点。开发者可以通过这个实例深入理解如何在JavaFX应用中处理和展示数据,为构建功能丰富的用户界面打下...

    javafx 2.0 tableView 实例

    在JavaFX 2.0版本中,`TableView`是一个核心的组件,用于展示结构化的数据集,类似于传统的电子表格。下面我们将深入探讨`TableView`的使用方法,包括数据列的绑定。 `TableView`是JavaFX中的一个视图类,它允许...

    table控件生成数据

    这些控件通常具有灵活的功能,如数据排序、过滤、搜索,以及本例中提到的行删除和列合并。在Web开发中,常见的表格控件有HTML `&lt;table&gt;` 标签、JavaScript 库如 jQuery DataTables、Angular Material 的 MatTable,...

    javafx ui controls

    通过本文档的学习,我们了解了 JavaFX UI 控件的基本使用方法。掌握了这些控件之后,你可以根据实际项目需求灵活地构建各种类型的用户界面。无论是简单的应用还是复杂的商业系统,JavaFX 都能提供所需的功能和支持,...

    TreeTable,用于展开/折叠table的行

    在计算机用户界面设计中,TreeTable结合了表格(Table)和树视图(TreeView)的优点,为用户提供了一种高效且直观的方式来浏览层次化数据。这种控件在诸如项目管理、文件系统浏览、数据库查询结果展示等多个场景中都...

    快速进行JAVA_Table开发的表格(收费)

    在Java开发中,表格(Table)的展示是常见的需求,特别是在数据管理、数据分析以及用户界面设计中。"快速进行JAVA_Table开发的表格"提供了一种高效的方法来实现这一功能,尤其适合初学者学习和测试。这个资源可能...

    TableViewSample

    在JavaFX中,TableView是一个强大的组件,用于展示结构化数据的列表。`TableViewSample`是一个典型的例子,展示了如何使用JavaFX绑定数据到TableView控件,从而实现数据的动态展示和交互。在这个项目中,我们主要...

    eXtremeTable的使用方法.rar

    3. **易于集成**:由于是用Java编写的,它可以无缝集成到Java应用程序中,与Java Swing或JavaFX等图形用户界面库配合良好。 4. **强大的数据操作**:提供丰富的API用于数据的添加、删除、修改和查询,支持条件过滤...

    Conversation3.pdf

    ### 如何在JavaFX TableView中实现过滤功能 在JavaFX应用程序中,`TableView`是非常常用的一个组件,用于展示数据表格。对于需要用户交互的应用场景,如动态筛选数据、排序等功能非常实用。本篇将详细介绍如何在...

    人事及财务管理系统

    在Java Swing或JavaFX中,TABLE组件允许用户以表格形式查看和操作数据,便于数据的分类、排序和过滤。通过自定义模型,开发者可以轻松地将数据库中的信息映射到表格中,使得用户能够直观地查看和管理人事及财务信息...

    Eclipse编写的简单表格

    7. **运行TableDemo**:在MyEclipse中,运行TableDemo类,你会看到一个包含预设数据的简单表格出现在屏幕上。 这个过程虽然简略,但涵盖了基本的表格创建步骤。更复杂的表格功能,如排序、过滤、编辑等,需要进一步...

    在java下可用的datatable组件

    它提供了丰富的功能,如分页、排序、过滤、行选择等,使得在Web应用中创建数据表变得简单。 5. **Model-View-Controller (MVC)**: 数据表组件通常遵循MVC设计模式,其中模型负责管理数据,视图负责显示数据,控制...

    java连接mysql的 gui图形界 面实现增删改查

    SQL语句的编写需要对SQL语法有深入理解,例如,WHERE子句用于指定条件,JOIN用于合并多表数据,GROUP BY和HAVING用于分组和过滤等。 在执行SQL语句时,我们通常使用Statement或PreparedStatement接口。...

    TreeTableView

    TreeTableView是一种特殊的用户界面元素,常见于图形用户界面(GUI)应用中,特别是在JavaFX或Swing等开发框架中。它结合了树视图(TreeView)和表格视图(TableView)的功能,允许用户同时以层次结构和表格的形式...

    Base-de-datos-MMA:使用 JavaFx、java8 和 SQLite 作为数据库管理器的带有 GUI 的数据库

    这些特性在数据库操作中起到了关键作用,特别是在数据过滤、排序和聚合等方面。 3. **SQLite**: SQLite是一款轻量级的嵌入式数据库,无需单独的服务器进程即可运行,适合于小型应用或者作为开发阶段的临时数据库。...

    sql.zip_SQL java_java sql_sql 查询_数据库 java_结果 查询

    在Java中,我们可以使用Swing或JavaFX等库来创建GUI(图形用户界面),显示数据。TableFrame可能就是一个使用JTable或TableView组件来展示SQL查询结果的类。JTable是Swing的一部分,可以方便地将数据模型与表格视图...

    数据库课程设计-报刊订阅系统-Java语言(代码+设计报告)

    例如,`SimpleTable.java`可能实现了基本的表格功能,而`DHTable.java`可能是在此基础上增加了排序、过滤等高级特性。 `myframe.java`可能代表了系统的主界面框架,使用了Java Swing或JavaFX库来创建图形用户界面...

Global site tag (gtag.js) - Google Analytics