JavaFXPorts:未选择 ListView 中的选定项目
JavaFXPorts: Selected item in ListView is not selected
示例代码如下:
package com.javafxportslistviewdemo;
import com.gluonhq.charm.down.Platform;
import com.gluonhq.charm.down.Services;
import com.gluonhq.charm.down.plugins.LifecycleEvent;
import com.gluonhq.charm.down.plugins.LifecycleService;
import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Screen;
import javafx.stage.Stage;
public class JavaFXPortsListViewDemo extends Application {
@Override
public void init() {
}
@Override
public void start(Stage primaryStage) throws Exception {
Screen primaryScreen = Screen.getPrimary();
Rectangle2D visualBounds = primaryScreen.getVisualBounds();
double width = visualBounds.getWidth();
double height = visualBounds.getHeight();
Label label = new Label("Here is selected item...");
ListView<String> listView = new ListView<>();
ObservableList<String> items = FXCollections.observableArrayList(
"one", "two", "three", "four");
listView.setItems(items);
listView.getSelectionModel().selectedItemProperty().addListener((ObservableValue<? extends String> ov, String old_val, String new_val) -> {
label.setText(new_val);
});
VBox root = new VBox();
root.getChildren().addAll(label, listView);
Scene scene = new Scene(root, width, height);
Services.get(LifecycleService.class).ifPresent(ls -> {
ls.addListener(LifecycleEvent.PAUSE, () -> onPause());
ls.addListener(LifecycleEvent.RESUME, () -> onResume());
});
scene.addEventHandler(KeyEvent.KEY_RELEASED, e -> {
if (KeyCode.ESCAPE.equals(e.getCode())) {
if (Platform.isAndroid()) {
// bring up the menu or other Android stuff
Services.get(LifecycleService.class).ifPresent(LifecycleService::shutdown);
} else {
// bring up the menu or other Desktop stuff
Services.get(LifecycleService.class).ifPresent(LifecycleService::shutdown);
}
}
});
primaryStage.setScene(scene);
primaryStage.show();
}
private void onPause() {
}
private void onResume() {
}
}
开发环境:JavaFXPorts 8.60.8、javafxmobile-plugin 1.1.0、Gluon Plugin 2.4.0、NetBeans 8.1、Windows 10 Pro,64 位
测试环境:Android 设备 Samsung Galaxy A5 2016,Android 6.0.1
重现步骤:1. 使用以下代码构建示例代码:JavaFXPorts 8.60.8、javafxmobile-plugin 1.1.0、Gluon Plugin 2.4.0; 2. 在 Android 设备上安装和 运行 示例 (Android 6.0.1); 3. 触摸 ListView 和 Select ListView 中的任何项目 - 项目未被选中 -> BUG
为 JavaFXPorts 的问题跟踪器添加了错误:JavaFXPorts issue
感谢您报告问题。
众所周知,在某些三星设备中,触摸事件处理与其他 Android 设备不同。
虽然这已在 JavaFXPorts 中修复,但您可以使用以下解决方法:为 ListCell
提供一个监听器,在内部连接选择。
根据您的样本:
ListView<String> listView = new ListView<>();
listView.setCellFactory(p -> new ListCell<String>() {
private String item;
{
setOnMouseClicked(e -> listView.getSelectionModel().select(item));
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
this.item = item;
setText(item);
}
});
listView.getSelectionModel().selectedItemProperty()
.addListener((ov, old_val, new_val) -> label.setText(new_val));
示例代码如下:
package com.javafxportslistviewdemo;
import com.gluonhq.charm.down.Platform;
import com.gluonhq.charm.down.Services;
import com.gluonhq.charm.down.plugins.LifecycleEvent;
import com.gluonhq.charm.down.plugins.LifecycleService;
import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Screen;
import javafx.stage.Stage;
public class JavaFXPortsListViewDemo extends Application {
@Override
public void init() {
}
@Override
public void start(Stage primaryStage) throws Exception {
Screen primaryScreen = Screen.getPrimary();
Rectangle2D visualBounds = primaryScreen.getVisualBounds();
double width = visualBounds.getWidth();
double height = visualBounds.getHeight();
Label label = new Label("Here is selected item...");
ListView<String> listView = new ListView<>();
ObservableList<String> items = FXCollections.observableArrayList(
"one", "two", "three", "four");
listView.setItems(items);
listView.getSelectionModel().selectedItemProperty().addListener((ObservableValue<? extends String> ov, String old_val, String new_val) -> {
label.setText(new_val);
});
VBox root = new VBox();
root.getChildren().addAll(label, listView);
Scene scene = new Scene(root, width, height);
Services.get(LifecycleService.class).ifPresent(ls -> {
ls.addListener(LifecycleEvent.PAUSE, () -> onPause());
ls.addListener(LifecycleEvent.RESUME, () -> onResume());
});
scene.addEventHandler(KeyEvent.KEY_RELEASED, e -> {
if (KeyCode.ESCAPE.equals(e.getCode())) {
if (Platform.isAndroid()) {
// bring up the menu or other Android stuff
Services.get(LifecycleService.class).ifPresent(LifecycleService::shutdown);
} else {
// bring up the menu or other Desktop stuff
Services.get(LifecycleService.class).ifPresent(LifecycleService::shutdown);
}
}
});
primaryStage.setScene(scene);
primaryStage.show();
}
private void onPause() {
}
private void onResume() {
}
}
开发环境:JavaFXPorts 8.60.8、javafxmobile-plugin 1.1.0、Gluon Plugin 2.4.0、NetBeans 8.1、Windows 10 Pro,64 位
测试环境:Android 设备 Samsung Galaxy A5 2016,Android 6.0.1
重现步骤:1. 使用以下代码构建示例代码:JavaFXPorts 8.60.8、javafxmobile-plugin 1.1.0、Gluon Plugin 2.4.0; 2. 在 Android 设备上安装和 运行 示例 (Android 6.0.1); 3. 触摸 ListView 和 Select ListView 中的任何项目 - 项目未被选中 -> BUG
为 JavaFXPorts 的问题跟踪器添加了错误:JavaFXPorts issue
感谢您报告问题。
众所周知,在某些三星设备中,触摸事件处理与其他 Android 设备不同。
虽然这已在 JavaFXPorts 中修复,但您可以使用以下解决方法:为 ListCell
提供一个监听器,在内部连接选择。
根据您的样本:
ListView<String> listView = new ListView<>();
listView.setCellFactory(p -> new ListCell<String>() {
private String item;
{
setOnMouseClicked(e -> listView.getSelectionModel().select(item));
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
this.item = item;
setText(item);
}
});
listView.getSelectionModel().selectedItemProperty()
.addListener((ov, old_val, new_val) -> label.setText(new_val));