[英]onScroll listener does not working in TableView in JavaFX 2
我正在嘗試使用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;
}
}
}
tablescroller.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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.