Как вы можете автоматически выбрать элемент списка, когда один из его внутренних компонентов получает фокус? - PullRequest
0 голосов
/ 04 июля 2019

У меня есть просмотр списка javafx, где каждая ячейка списка содержит графику с несколькими узлами. Одним из таких узлов является текстовое поле. Когда текстовое поле получает фокус (пользователь нажимает на него), я бы хотел, чтобы ячейка списка, в которой он расположен, также была выделена. Я не смог найти общий способ добиться этого в javafx.

Я могу добиться того, чего хочу, жестко запрограммировав таким образом, чтобы получить всю информацию, необходимую для выбора нужного элемента, но я бы хотел этого избежать, если есть лучший способ. Вот что мне нужно было сделать в моем более сложном приложении ...

Родительский скин = this.getParent (). GetParent (). GetParent (). GetParent ();

int index = skin.getParent (). GetChildrenUnmodifiable (). IndexOf (skin);

ListView listview = (ListView) . Skin.getParent () GetParent () GetParent () GetParent ();..

listview.getSelectionModel () выберите (индекс);.

Вот простое приложение, которое, как мы надеемся, иллюстрирует проблему. Любая помощь будет принята с благодарностью.

    package uitesting;

    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.ListCell;
    import javafx.scene.control.ListView;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;

    public class testSelection extends Application {
        public static void main(String[] args){
            launch(args);
        }

        @Override
        public void start(Stage primaryStage) throws Exception {
            AnchorPane pane = new AnchorPane();
            ListView<String> viewer = new ListView<>();
            AnchorPane.setTopAnchor(viewer,5D);AnchorPane.setLeftAnchor(viewer,5D);
            AnchorPane.setBottomAnchor(viewer,5D);AnchorPane.setRightAnchor(viewer,5D);
            pane.getChildren().add(viewer); // Add listview to root pane
            ObservableList<String> viewItems = FXCollections.observableArrayList(
                    "Lorem Ipsum",
                    "I would like the cell this is located in to get selected when this text is clicked while the cell is not selected.",
                    "A third listcell");
            viewer.setItems(viewItems);
            // Modify the cell factory
            viewer.setCellFactory((e)->new myListCell());
            // create and start the stage
            primaryStage.setTitle("Test GUI");
            primaryStage.setScene(new Scene(pane, 600, 300));
            primaryStage.show();
        }
        static VBox createGraphic(String text){
            // Put together an example pane with a button and a textfield that will go into each listcell
            Button buttonA = new Button("A Button");
            TextField textField = new TextField(text);
            textField.setEditable(false);
            VBox root = new VBox();
            root.getChildren().addAll(buttonA,textField);
            return root;
        }
    }
    class myListCell extends ListCell<String>{
        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (item == null || empty) {
                setText(null);
                setGraphic(null);
            } else {
                setText(null);
                setGraphic(testSelection.createGraphic(item));
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...