У меня есть просмотр списка 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));
}
}
}