TitledPane の新しいコレクションでアコーディオンを補充したいのですが、アコーディオンでノードを展開するときに問題が発生しました。
JavaFX ライブラリの問題だと思います。Oracle の Accordion および TitledPane のマニュアルで提供されているサンプルでも発生するためです。元の例 22-5 を次のように変更します。
public void start(Stage stage) {
stage.setTitle("TitledPane");
Scene scene = new Scene(new Group(), 800, 250);
scene.setFill(Color.GHOSTWHITE);
final Label label = new Label("Initial");
// --- Accordion
final Accordion accordion = new Accordion ();
for (int i = 0; i < imageNames.length; i++) {
images[i] = new
Image(getClass().getResourceAsStream(imageNames[i] + ".jpg"));
pics[i] = new ImageView(images[i]);
tps[i] = new TitledPane(imageNames[i],pics[i]);
}
accordion.getPanes().addAll(tps);
accordion.expandedPaneProperty().addListener(new
ChangeListener<TitledPane>() {
public void changed(ObservableValue<? extends TitledPane> ov,
TitledPane old_val, TitledPane new_val) {
if (new_val != null) {
label.setText("expanded: " +accordion.getExpandedPane().getText());
}
}
});
HBox hbox = new HBox(10);
Button buttonClear = new Button("Clear and refill");
buttonClear.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
for (int i = 0; i < imageNames.length; i++) {
tps[i] = new TitledPane(imageNames[i]+" refill",pics[i]);
}
accordion.getPanes().clear();
accordion.getPanes().addAll(tps);
accordion.getPanes().get(0).setExpanded(true);
}
});
hbox.setPadding(new Insets(20, 0, 0, 20));
hbox.getChildren().setAll(label, accordion, buttonClear);
Group root = (Group)scene.getRoot();
root.getChildren().add(hbox);
stage.setScene(scene);
stage.show();
}
展開された TitledPane を変更すると、ラベルはその値を取得します。また、アコーディオンのすべての TitledPane をクリアし、新しいものを作成して、最初の TitledPane を Expanded として設定するボタンも追加しました。
したがって、ボタンを押すと、アコーディオンが補充され、ラベルには、最初の TitledPane が展開されているが、最後の TitledPane は選択されているように見えますが、画像はありません。これは、このボタンを 2 回押すか、以前に TitledPane の 1 つを選択した場合に発生します。
そして、これはまさに私がやりたいことです。すべての TitledPane をクリアし、新しい TitledPane で再入力すると、同じ奇妙な結果が得られます。
前に説明したこの副作用なしに、すべての TitledPane を消去し、新しいものを作成して、最初の TitledPane を拡張として設定するにはどうすればよいですか?
読んでくれてありがとう!