首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用静态内容

问调用静态内容
EN

Stack Overflow用户
提问于 2013-08-24 18:48:15
回答 2查看 145关注 0票数 0

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

代码语言:javascript
复制
private static final ImageView ncpic;    
    static {
        ncpic = new ImageView(TabContent.class.getResource("/images/6.jpg").toExternalForm());
    }

我注意到我只能用这张照片一次。当我用它的两倍,我称之为它是空的。我怎么能用这张照片两次或更多次?也许这是由我调用以显示图片的静态java方法造成的?

P.S .快速例子:

代码语言:javascript
复制
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中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-24 22:19:40

为什么只有一个ImageView显示

ImageView是一个节点。在SceneGraph中,只能有一个节点的实例。见节点文档

如果程序将子节点添加到父节点(包括组、区域等),并且该节点已经是另一个父节点的子节点或场景的根,则该节点将自动(并且是静默地)从以前的父节点中删除。

如何修复It

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

代码语言:javascript
复制
private static final Image ncpic = new Image(
  TabContent.class.getResource(
    "/images/6.jpg"
  ).toExternalForm()
);

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

还请注意,上述代码将在Java7下工作,但适用于在当前Java 8早期访问版本下可能会失败。您将确信,如果JavaFX系统是在静态代码运行之前首先初始化的(例如,您的应用程序的init或start方法以前已经执行过),那么代码将在Java8中工作。

每当您想要重用图像时,只需将其包装在一个新的ImageView中,然后再将它添加到场景中。例如:

代码语言:javascript
复制
pane1.add(new ImageView(ncpic));
pane2.add(new ImageView(ncpic));

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

示例代码

Peter问题中的示例代码可以重写如下,以便正确地工作:

代码语言:javascript
复制
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;
  }
}
票数 2
EN

Stack Overflow用户

发布于 2013-08-24 19:07:35

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

代码语言:javascript
复制
class ImageManager {
    public static ImageView imageView;

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18421952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档