JavaFXPorts: выбранный элемент в ListView не выбран

Вот пример кода:

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 и выберите любой элемент из ListView - элемент не выбран -> ОШИБКА

Добавлена ​​ошибка для отслеживания ошибок JavaFXPorts: Проблема с JavaFXPorts


person Ladislav Török    schedule 08.11.2016    source источник


Ответы (1)


Спасибо, что сообщили о проблеме.

Уже известно, что на некоторых устройствах Samsung обработка событий касания работает не так, как на остальных устройствах 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));
person José Pereda    schedule 08.11.2016
comment
Ваш обходной путь приемлем. Спасибо. ... и хотите ли вы что-нибудь сказать ">Поведение поля со списком - person Ladislav Török; 08.11.2016
comment
Как насчет добавления этого в ячейку вместо прослушивателя мыши: { listView.getSelectionModel().select(item); } - person José Pereda; 08.11.2016
comment
Стилизация по-прежнему не работает, и выбор элемента снова не работает. - person Ladislav Török; 08.11.2016
comment
Можете ли вы попробовать это: { setOnMouseClicked(e -> listView.getSelectionModel().select(item)); }? (не могу воспроизвести) - person José Pereda; 08.11.2016
comment
Для меня полный рабочий обходной путь: { setOnMouseClicked(e -> { label.setText(item); listView.getSelectionModel().select(item); }); } ... и стилизация и выбор работают. Спасибо. - person Ladislav Török; 08.11.2016
comment
Вы можете удалить часть label.setText(), если сохраните исходный слушатель в listView.getSelectionModel().selectedItemProperty(). Я отредактировал свой ответ с ним. - person José Pereda; 08.11.2016