Andréのおかげで、交換されたコンポーネントの固定高さを設定すると問題が解決されたことがわかりました。 SSCCEは次のとおりです。
@Override
protected void init(VaadinRequest request) {
VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
layout.setSpacing(true);
setContent(layout);
TextField t1 = new TextField("Big field (1)");
t1.setWidth("300px");
t1.setHeight("1000px");
layout.addComponent(t1);
TextField t2 = new TextField("Big field (2)");
t2.setWidth("300px");
t2.setHeight("1000px");
layout.addComponent(t2);
final Component[] toReplace = new Component[] { t2 };
Button button = new Button("Click Me");
button.addClickListener(event -> {
Table t = new Table();
t.addContainerProperty("Name", String.class, null);
for (int i = 0; i < 20; i++) {
t.addItem(new Object[] { "" + i }, i);
}
//t.setHeight("200px");
layout.replaceComponent(toReplace[0], t);
toReplace[0] = t;
});
layout.addComponent(button);
setContent(layout);
}
高さが設定されていないと、スクロールの問題が発生します。
これは大きなヒントですが、問題を解決しませんでした。コンポーネントを置き換えた後にスクロールトップ値を設定しても、スクロール位置は置換されたコンポーネントが存在しないようなものでした。再生のために私はその簡単な例を作って(私の答えを見てください)、固定された高さが助けになることを発見しました。 –