当前位置: 首页 > 面试题库 >

onScroll侦听器在JavaFX 2的TableView中不起作用

黄高爽
2023-03-14
问题内容

我正在尝试使用TableView组件的onScroll事件侦听器:

FXML:

<TableView fx:id="table" onScroll="#doSomething" tableMenuButtonVisible="true" VBox.vgrow="ALWAYS">
    <columnResizePolicy>
        <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
    </columnResizePolicy>
</TableView>

Java控制器:

@FXML
void doSomething(ActionEvent event)
{
    System.out.println("Object: " + event.getSource());
}

但这不起作用!我做错了什么?

我需要捕获垂直滚动器以手动控制滚动位置并根据向下或向上滚动获取相关数据。

谢谢大家!


问题答案:

我认为可能发生的情况是TableView包含的自身正在消耗scroll事件并在内部对其进行处理,因此它永远不会到达您的应用程序处理程序。

最初,我认为您可能要使用onScrollTo而不是onScroll,但这似乎并不能真正解决问题。

我认为有效的解决方案是在滚动事件上应用过滤器。

此外,您可以编写代码来使用scrollTo“手动控制滚动位置”的调用。

这是您可以尝试的一些示例代码(Java 8):

TableScrollerApp.java

package finder;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class TableScrollerApp extends Application {
    @Override public void start(final Stage stage) throws Exception {
        FXMLLoader loader = new FXMLLoader(
            getClass().getResource("tablescroller.fxml")
        );
        Parent parent = loader.load();

        stage.setScene(new Scene(new Group(parent)));
        stage.show();
    }

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

TableScrollerController.java

package finder;

import javafx.beans.property.ReadOnlyStringProperty;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.fxml.FXML;
import javafx.scene.control.ScrollToEvent;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.ScrollEvent;

import java.util.Arrays;
import java.util.stream.Collectors;

public class TableScrollerController {
    private static final String[] fruitNames = {
            "apples", "oranges", "pears", "peaches", 
            "guavas", "bananas", "jackfruit", "durians"
    };

    @FXML
    private TableView<Fruit> fruitsTable;

    @FXML
    private TableColumn<Fruit, String> fruitsColumn;

    @FXML
    protected void initialize() {
        fruitsColumn.setCellValueFactory(new PropertyValueFactory<>("name"));

        fruitsTable.addEventFilter(ScrollEvent.ANY, event ->
                System.out.println("Coded scroll filter: " + event)
        );

        fruitsTable.getItems().setAll(
                Arrays.stream(fruitNames)
                        .map(Fruit::new)
                        .collect(Collectors.toList())
        );

        fruitsTable.scrollTo(5);
    }

    @FXML
    protected void onScrollHandler(ScrollEvent scrollEvent) {
        System.out.println("FXML referenced scroll handler: " + scrollEvent);
    }

    @FXML
    protected void onScrollToHandler(ScrollToEvent<Integer> scrollToEvent) {
        System.out.println("FXML referenced onScroll handler: " + scrollToEvent);
    }

    public static class Fruit {
        private ReadOnlyStringWrapper name;

        public Fruit(String name) {
            this.name = new ReadOnlyStringWrapper(name);
        }

        public String getName() {
            return name.get();
        }

        public ReadOnlyStringProperty nameProperty() {
            return name;
        }
    }
}

tablecroller.fxml

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

<?import javafx.scene.control.*?>

<TableView fx:id="fruitsTable" 
           maxHeight="-Infinity" maxWidth="-Infinity" 
           minHeight="-Infinity" minWidth="-Infinity" 
           onScroll="#onScrollHandler" 
           onScrollTo="#onScrollToHandler" 
           prefHeight="100.0" prefWidth="250.0" 
           xmlns="http://javafx.com/javafx/8" 
           xmlns:fx="http://javafx.com/fxml/1" 
           fx:controller="finder.TableScrollerController">
  <columns>
    <TableColumn fx:id="fruitsColumn" 
                 maxWidth="800.0" minWidth="200.0" prefWidth="-1.0" 
                 text="Fruits" />
  </columns>
</TableView>


 类似资料:
  • 问题内容: 我正在使用primefaces 3.2和JSF 2.0 我的情况是我的表单中有文件日期,上次日期和下一个日期。当用户输入文件日期时,我需要更新bean中的文件日期值,以便该值可以用作属性提示的最后日期中的最小日期,因此可以在下一个日期选择中使用。 根据我的知识价值更改侦听器可以在提交表单时执行,所以我不能使用它。我用过 p:ajax 。但是我仍然无法设置文件日期。由于未设置文件日期,因

  • 问题内容: 我试图将onscroll事件处理程序添加到特定的dom元素。看下面的代码: 代码非常简单,如您所见,我想处理div#list滚动。当我运行此示例时,它不起作用。所以我尝试直接在render方法上绑定this._handleScroll,它也不起作用。 因此,我打开了chrome inspector,直接使用以下命令添加了onscroll事件: 它正在工作!我不知道为什么会这样。这是Re

  • 我有一个简单的HibernateInterceptor,基本上我想自动设置几个字段。此拦截器(如下所示)扩展了EmptyInterceptor: 我使用spring配置文件进行布线,如下所示: 但是,永远无法到达拦截器。有人有什么线索吗?我还尝试将以下内容添加到事务管理器bean定义中,如下所示:

  • 我正在使用布局的网格视图,它在列表中的网格视图项之后不工作,它在logcat错误中显示“throwIndexOutOfBoundsException”。没有onclick函数,如果我使用toast它的工作,如果我为下一个活动提供一个onlicck函数,它将不工作 Gridviewadapter.java 主活动.java gridview的Onclick函数在这里不起作用,我也发布了我的xml布局

  • 下面的代码是项目的动作侦听器。基本上,我有 4 个单选按钮,当我单击一个时,我希望它更改屏幕上的变量。当我运行代码时,它只是将所有值相加。还有其他方法可以做到这一点吗?

  • 希望我能把问题弄得尽可能清楚。我正在使用JavaFX库为GUI开发一个小型java应用程序。我正在做一个POP连接,并将消息存储为ObservableList。为此,我使用javax.mail。我将这个observablelist传递给一个tableview,并通过以下方式将所需的值传递给TableColumns: Subject和sentDate是完美的读入。但不幸的是,“from”将对象引用添