调用静态内容

时间:2013-08-24 18:48:16

标签: java

我有来自JavaFX应用程序的代码:

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

我注意到我只能使用这张照片一次。当我使用它两次我称之为它的场景时它是空的。如何使用此图片两次或更多次? 也许这是由我调用以显示图片的静态java方法引起的?

P.S快速示例:

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 Class。

2 个答案:

答案 0 :(得分:2)

尝试在绘制之前克隆该对象:

class ImageManager {
    public static ImageView imageView;

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

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

方法clone()有可能将相同的数据引用传递给这个新实例,而不是再次创建它。所以它将是一个新对象,但具有相同的资源。

答案 1 :(得分:2)

为什么只有一个ImageView显示

ImageView是一个节点。您只能在SceneGraph中拥有一个Node的单个实例。请参阅Node documentation

  

如果程序将子节点添加到父节点(包括组,区域,   等)并且该节点已经是不同父节点或子节点的子节点   在场景的根,自动(并静默)删除节点   它的前任父母。

如何修复

如果要在多个节点之间共享图像数据,可以这样做。例如。

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

请注意,只需一个初始化语句就不需要静态块。

另请注意,上述代码将在Java 7下运行,但may fail under the current Java 8 early access release。如果JavaFX系统在静态代码运行之前首先被初始化(例如,先前已经执行了应用程序的init或start方法),那么您将确信代码将在Java 8中工作。

每当您想重用Image时,只需将其包装在新的ImageView中,然后再将其添加到Scene中。例如:

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

现在,图像将同时显示在pane1和pane2中,而不是仅显示在pane2中,就像尝试重用单个静态ImageView实例一样。

示例代码

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;
  }
}