【问题标题】:JavaFX Filter TableView when method is in another class当方法在另一个类中时JavaFX过滤TableView
【发布时间】:2017-02-15 15:17:22
【问题描述】:

如果这对你们来说真的很简单,我很抱歉,但我遇到了麻烦。我正在尝试完成一个 JavaFX 应用程序,并且快完成了。

我在过滤 TableView 时遇到问题。我有一个 TextField 作为我的搜索输入,还有一个按钮作为我的“提交”按钮进行搜索。我知道事件侦听器以及 TextFields 不能过滤 TableView 的内容。我不反对这个选项,但是,我需要按钮功能。

我的主舞台有一个 MainController 类,在那里我放置了两个 TableView 和搜索输入字段/按钮。

现在,该方法称为“lookupProduct(int id)”,但它位于另一个类中:Inventory

所以,我的问题是,如何从 MainController 调用 Inventory 类中的方法,并以这种方式过滤 TableView?对不起。我无法发布代码,但我可以提供尽可能好的示例。

包含方法.java

private MainController mainController;
.....

void lookUpProduct(int id){
    FilteredList<Product> filteredList = new FilteredList<Product>(maincontroller.productsTableView.getItems());
    filteredList.stream()

            .filter(item -> item.getName() == name)
            .findAny()
            .ifPresent(item -> {
                maincontroller.productsTableView.getSelectionModel().select(item);
                maincontroller.productsTableView.scrollTo(item);
            });
    maincontroller.productsTableView.setItems(filteredList);
}

MainController.java

@FXML
private void handleLookupProduct(ActionEvent event) {
    Inventory inv = new Inventory();
    String searchText = productsSearchInput.getText();
    if (searchText.length() != 0) {
        inv.lookupProduct(searchText);
    } else {
        AlertBox.display("WAIT!", "Please enter a value to search!", 450);
    }
}

您可以提供的任何帮助、指导和建议将不胜感激。谢谢!

【问题讨论】:

  • 你能把lookUpProduct移到MainController吗?看起来它需要的一切都在MainController 中。
  • 我假设您没有MainController 的实例变量,这就是它不起作用的原因。
  • 您在哪里加载每个作为控制器的 FXML 文件?
  • @HypnicJerk 该方法必须在该类中。主控制器包含我需要过滤的表。另一个类包含查找产品(过滤器)的方法。
  • @James_D FXML 加载器位于 MainController 类中。他们根据事件需要加载其他控制器。因此,在 MainController 类中指定了搜索输入和表。从那里,如您在上面看到的,我有一个事件将搜索字符串发送到 ContainsMethod 类(例如),如果您进一步看上面,如果我试图过滤表的位置。没有调用新的控制器,也没有打开/切换阶段。

标签: java uitableview javafx


【解决方案1】:

为了解决这个问题,我不得不做一些不同的事情:

Inventory.java

private MainController main;
@FXML private TableView<Product> productTableView;

public void setProductTableView(TableView<Product> main){
    this.productTableView = main;
}
public void setMainView(MainController main){ this.main = main; }

 void lookupProduct(String name){
    FilteredList<Product> filteredList = new FilteredList<Product>(productTableView.getItems());
    filteredList.stream()
            .filter(item -> item.getName().equalsIgnoreCase(name))
            .findAny()
            .ifPresent(item -> {
                productTableView.getSelectionModel().select(item);
                productTableView.scrollTo(item);
            });
    main.productsTableView.setItems(filteredList);
}

MainController.java

@FXML
private void handleLookupProduct(ActionEvent event) {
    Inventory inv = new Inventory();

    String searchText = productsSearchInput.getText();
    if (searchText.length() != 0) {

        inv.setMainView(this);
        inv.setProductTableView(productsTableView);
        inv.lookupProduct(searchText);
    } else {
        AlertBox.display("WAIT!", "Please enter a value to search!", 450);
    }
}

我必须在 Inventory.java 中创建一个方法来设置 MainController 实例,然后必须将 TableView 发送到 Inventory.java 以允许我获取所有项目从表视图。然后允许我过滤这些结果。

在 Inventory 中设置 MainController 实例后,我可以在 MainController

中的表上设置 FilteredList 项

【讨论】:

    猜你喜欢
    • 2018-08-06
    • 1970-01-01
    • 2017-08-13
    • 2021-08-23
    • 1970-01-01
    • 2017-09-15
    • 2019-02-10
    • 1970-01-01
    • 2014-08-06
    相关资源
    最近更新 更多