当前位置: 首页 > 知识库问答 >
问题:

Javafx在tableview中更改过滤列表的字体颜色

曾珂
2023-03-14

简单代码

       String sDriverName = "org.sqlite.JDBC";
        try {
            Class.forName(sDriverName);
            String sTempDb = "systemnet.db";
            String sJdbc = "jdbc:sqlite";
            String sDbUrl = sJdbc + ":" + sTempDb;
             // create a database connection
            Connection conn = DriverManager.getConnection(sDbUrl);
            try {
                Statement stmt = conn.createStatement();
                try {

                     try {            
          connected();
             data = FXCollections.observableArrayList();
            ResultSet rs = stmt.executeQuery("SELECT * from Belgiler");
              while (rs.next()) {
                data.add(new form1Controller.userdata(rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4)));
              }
             cid.setCellValueFactory(new PropertyValueFactory("id"));
             ctwo.setCellValueFactory(new PropertyValueFactory("two"));
             csec.setCellValueFactory(new PropertyValueFactory("sec"));
             ctri.setCellValueFactory(new PropertyValueFactory("tri"));
              tablesettings.setItems(null);
              tablesettings.setItems(data);
              tablesettings.setEditable(true);
            closed();
        } catch (Exception e) {System.out.println("Error on Building Data"+ e.toString());

        }

                } finally {
                    try { stmt.close(); } catch (Exception ignore) {}
                }
            } finally {
                try { conn.close(); } catch (Exception ignore) {}
            }
        }   catch (Exception ex) {
            Logger.getLogger(form1Controller.class.getName()).log(Level.SEVERE, null, ex);
        }


       FilteredList<userdata> filt = new FilteredList<>(data, p ->true);
            textfield1.textProperty().addListener((observable, oldValue, newValue) -> { 
            filt.setPredicate(userdata -> {
            if (newValue == null || newValue.isEmpty()) {
                    return true;
                }  
                String lowerCaseFilter = newValue.toLowerCase();
           if (userdata.two.toString().toLowerCase().contains(lowerCaseFilter)) {
               return true; // change font color
                } else if (userdata.sec.toString().toLowerCase().contains(lowerCaseFilter)) {
                    return true; 
                }
                return false; // Does not match.
            });SortedList<userdata> sortedData = new SortedList<>(filt);
        sortedData.comparatorProperty().bind(tablesettings.comparatorProperty());
        tablesettings.setItems(sortedData);
        });

共有1个答案

徐隐水
2023-03-14

使用自定义的TableCell来观察search text属性,并对其图形而不是纯文本使用TextFlow。当search text属性更改时,或者从UpdateItem(...)方法中查找项中搜索文本的出现,并从块中生成文本流,以便可以突出显示适当的块。

这里有一个简单的例子,它只突出显示文本的第一次出现;如果您愿意,可以修改它以突出显示所有出现的情况:

import javafx.beans.value.ObservableValue;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.TableCell;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;

public class HighlightingTableCell<S> extends TableCell<S, String> {

    private final ObservableValue<String> highlightText ;

    private final TextFlow textFlow ;

    public HighlightingTableCell(ObservableValue<String> highlightText) {
        this.highlightText = highlightText ;
        this.textFlow = new TextFlow() ;
        textFlow.setPrefHeight(12);

        highlightText.addListener((obs, oldText, newText) -> {
            updateTextFlow(newText);
        });

        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if (empty) {
            setGraphic(null);
        } else {
            updateTextFlow(highlightText.getValue());
            setGraphic(textFlow);
        }
    }


    private void updateTextFlow(String highlight) {
        if (isEmpty()) {
            return ;
        }

        String item = getItem();
        int index = item.indexOf(highlight);

        if (highlight.isEmpty() || index < 0) {
            Text text = new Text(item);
            textFlow.getChildren().setAll(text);
            return ;
        }

        Text prior = new Text(item.substring(0, index));
        Text highlighted = new Text(item.substring(index, index+highlight.length()));
        highlighted.getStyleClass().add("highlight");
        Text post = new Text(item.substring(index+highlight.length()));     
        textFlow.getChildren().setAll(prior, highlighted, post);

    }


}

下面是一个快速的测试案例:

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class HighlightingFilteredTable extends Application {

    @Override
    public void start(Stage primaryStage) {
        TableView<Person> table = new TableView<>();

        TextField searchField = new TextField();
        searchField.setPromptText("Enter filter text");

        TableColumn<Person, String> firstNameColumn = new TableColumn<>("First Name");
        firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
        firstNameColumn.setCellFactory(tc -> new HighlightingTableCell<>(searchField.textProperty()));

        TableColumn<Person, String> lastNameColumn = new TableColumn<>("Last Name");
        lastNameColumn.setCellValueFactory(cellData -> cellData.getValue().lastNameProperty());
        lastNameColumn.setCellFactory(tc -> new HighlightingTableCell<>(searchField.textProperty()));

        table.getColumns().add(firstNameColumn);
        table.getColumns().add(lastNameColumn);

        ObservableList<Person> allData= FXCollections.observableArrayList(
                new Person("Jacob", "Smith"),
                new Person("Isabella", "Johnson"),
                new Person("Ethan", "Williams"),
                new Person("Emma", "Jones"),
                new Person("Michael", "Brown")
        );

        FilteredList<Person> filteredList = new FilteredList<>(allData);
        filteredList.predicateProperty().bind(Bindings.createObjectBinding(() -> 
            person -> person.getFirstName().contains(searchField.getText()) || person.getLastName().contains(searchField.getText()), 
            searchField.textProperty()));

        table.setItems(filteredList);

        BorderPane.setMargin(searchField, new Insets(5));
        BorderPane root = new BorderPane(table,searchField, null, null, null);
        Scene scene = new Scene(root);
        scene.getStylesheets().add("style.css");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static class Person {
        private final StringProperty firstName = new SimpleStringProperty();
        private final StringProperty lastName = new SimpleStringProperty();

        public Person(String firstName, String lastName) {
            setFirstName(firstName);
            setLastName(lastName);
        }

        public final StringProperty firstNameProperty() {
            return this.firstName;
        }


        public final String getFirstName() {
            return this.firstNameProperty().get();
        }


        public final void setFirstName(final String firstName) {
            this.firstNameProperty().set(firstName);
        }


        public final StringProperty lastNameProperty() {
            return this.lastName;
        }


        public final String getLastName() {
            return this.lastNameProperty().get();
        }


        public final void setLastName(final String lastName) {
            this.lastNameProperty().set(lastName);
        }



    }

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

使用style.css:

.table-cell .highlight {
    -fx-fill: red ;
}
 类似资料:
  • 我在javaFX中有一个文本字段,在该字段中键入的任何内容都必须以蓝色显示,这可以通过css实现吗?如果是,那么如何?

  • 问题内容: 在我的Java桌面应用程序中,我有一个包含3列的JavaFX表。我想将第三列的字体颜色设置为红色。我根本无法设置Tableb的字体颜色。我查看了CSS,但没有找到任何东西。有没有办法用CSS做到这一点?我还希望通过setFont()进行设置。空空如也。我什至无法找到在某个单元格上设置某些内容的方法。 我该怎么做?如何设置字体颜色?任何帮助将不胜感激。 问题答案: 您需要覆盖CellFa

  • 我需要在javafx tableview中实现一个拥有庞大数据(大约10万)的过滤器, 我试过这个教程。它可以工作,但与swing排序和过滤相比,过滤速度非常慢。 谁能帮我提速吗。 现在正在发生的事情是,当我键入textproperty change fire up和filterdata时,但速度很慢,我需要一些东西来显示筛选结果,并在swing中快速键入。 提前谢谢。 p、 我也看过这个。

  • 本文向大家介绍如何更改JavaFX XY图表中刻度线的颜色和字体?,包括了如何更改JavaFX XY图表中刻度线的颜色和字体?的使用技巧和注意事项,需要的朋友参考一下 该javafx.scene.XYChart类是基类所有已在xy窗格中绘制的图表。通过实例化此类的子类,您可以创建各种XY图表,即-折线图,面积图,条形图,饼图,气泡图,散点图等。 在XY图表中,给定的数据点绘制在XY平面上。沿x和y

  • 我在java fx中有一个tableview,它显示不同类型的数据,如字符串和整数。我想有一个数据过滤器,这样它就可以自动在table View中显示数据。我怎样才能做到这一点呢?目前我正在使用一个函数,但它不起作用。注意:“pers”是我正在使用的类的一个对象

  • 下面的代码被修改为不包括我的数据库中的任何数据。 然后将其传递到initialize方法中,在该方法中进行表的实际填充。 顺便说一下,Users类如下所示: 该程序按预期工作,我可以看到与图像和VBox的详细信息的表格。 现在我想添加一个TextField来过滤表,过滤参数是标签中的文本。 我明白了,我需要将ObservableList放入FilteredList中,然后放入SortedList中