Так что основная проблема, которую я имею, - это когда я нажимаю кнопку прокрутки.Изменяется видовой экран области прокрутки, но не дочерние элементы (узел) панели.Я должен либо запросить фокус на панели, либо щелкнуть значок в меню задач, чтобы содержимое Viewport обновилось.Swing делает это автоматически при перемещении полос прокрутки.
Есть ли другой способ заставить эту функциональность работать, как описано выше и с помощью кода?Запрос вызова Focus () мне кажется странным.Кстати: он подсвечивает каждый раз, когда надоедает.
Вот что я получил до сих пор:
public class ScrollPaneTest extends Application {
private ScrollPane scrollPane;
private StackPane stackPane;
private Pane pane;
private Button button;
@Override
public void start(Stage primaryStage) throws Exception {
scrollPane = new ScrollPane();
stackPane = new StackPane();
pane = new Pane();
button = new Button();
scrollPane.setPrefHeight(400.0);
scrollPane.setPrefWidth(600.0);
stackPane.setPrefHeight(1000.0);
stackPane.setPrefWidth(1000.0);
pane.setPrefHeight(200.0);
pane.setPrefWidth(200.0);
button.setMnemonicParsing(false);
button.setText("Button");
pane.getChildren().add(button);
stackPane.getChildren().add(pane);
scrollPane.setContent(stackPane);
scrollPane.viewportBoundsProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue observable, Object oldValue, Object newValue) {
Bounds oldViewportBounds = (Bounds) oldValue;
Bounds newViewportBounds = (Bounds) newValue;
double x = newViewportBounds.getMinX() * -1;
double y = newViewportBounds.getMinY() * -1;
button.setLayoutX(x);
button.setLayoutY(y);
// Working if focus is requested ...
//pane.requestFocus();
// ... or when clicked on the application icon in the taskmenu of windows
// Doesn't work
//pane.requestLayout();
}
});
VBox vbox = new VBox();
vbox.setPrefHeight(400.0);
vbox.setPrefWidth(600.0);
vbox.getChildren().add(scrollPane);
Scene scene = new Scene(vbox);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
} }
Для иллюстрации:
Кнопка полосы прокрутки не нажата
Нажатие кнопки полосы прокрутки дважды