0

私はJavaFXアプリケーションからこのコードを持っています:

private static final ImageView ncpic;    
    static {
        ncpic = new ImageView(TabContent.class.getResource("/images/6.jpg").toExternalForm());
    }

この写真は一度しか使えないことに気付きました。2回使うと呼ぶシーンが空っぽ。この写真を 2 回以上使用するにはどうすればよいですか? これは、画像を表示するために呼び出した静的 Java メソッドが原因でしょうか?

PS簡単な例:

public class TabContent {

    private static final ImageView ncpic;    
        static {
            ncpic = new ImageView(TabContent.class.getResource("/images/6.jpg").toExternalForm());
        }

        private static StackPane generalConfiguration() {

            StackPane stack = new StackPane();
            stack.getChildren().addAll(ncpic);   // Add the picture and the Label
            return stack;
        }
}

私はこのように使用します: TabContent.generalConfiguration() そして、別の Java クラスで 2 回目。

4

2 に答える 2

2

描画する前に、そのオブジェクトのクローンを作成してみてください。

class ImageManager {
    public static ImageView imageView;

    static {
        imageView = new ImageView(...);
    }

   public static ImageView getImageView() {
        return imageView.clone();
    }
}

clone() メソッドが、この新しいインスタンスを再度作成する代わりに、同じデータ参照をこの新しいインスタンスに渡す可能性があります。したがって、それは新しいオブジェクトになりますが、同じリソースを持ちます。

于 2013-08-24T19:07:35.057 に答える
2

ImageView が 1 つしか表示されない理由

ImageViewノードです。SceneGraph では、Node のインスタンスを 1 つだけ持つことができます。ノードのドキュメントを参照してください。

プログラムが親 (グループ、リージョンなどを含む) に子ノードを追加し、そのノードが既に別の親の子であるか、シーンのルートである場合、ノードは自動的に (そしてサイレントに) 元の親から削除されます。

修正方法

複数のノード間で画像データを共有したい場合は、そうすることができます。例えば。

private static final Image ncpic = new Image(
  TabContent.class.getResource(
    "/images/6.jpg"
  ).toExternalForm()
);

単一の初期化ステートメントだけに静的ブロックは必要ないことに注意してください。

また、上記のコードは Java 7 で動作しますが、現在の Java 8 アーリー アクセス リリースでは動作しない可能性があることに注意してください。静的コードを実行する前に JavaFX システムが最初に初期化されている場合 (たとえば、アプリケーションの init メソッドまたは start メソッドが以前に実行されている場合)、コードは Java 8 で確実に機能します。

画像を再利用する場合は、シーンに追加する前に新しい ImageView でラップするだけです。例えば:

pane1.add(new ImageView(ncpic));
pane2.add(new ImageView(ncpic));

これで、単一の静的 ImageView インスタンスを再利用しようとした場合のように、pane2 だけではなく、pane1 と pane2 の両方に画像が表示されます。

サンプルコード

Peter の質問のサンプル コードは、正しく機能するように次のように書き直すことができます。

public class TabContent {
  private static final Image ncpic = new Image(
    TabContent.class.getResource(
      "/images/6.jpg"
    ).toExternalForm()
  );

  private static StackPane generalConfiguration() {
    StackPane stack = new StackPane(); 
    stack.getChildren().addAll(new ImageView(ncpic));  

    return stack;
  }
}
于 2013-08-24T22:19:40.070 に答える