Java 调用静态内容

Java 调用静态内容,java,Java,我从JavaFX应用程序中获得以下代码: private static final ImageView ncpic; static { ncpic = new ImageView(TabContent.class.getResource("/images/6.jpg").toExternalForm()); } 我注意到我只能用这张照片一次。当我使用它两次时,我称之为的场景是空的。如何使用此图片两次或更多次? 也许这是因为我调用静态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 ImageManager {
    public static ImageView imageView;

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

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

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

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

class ImageManager {
    public static ImageView imageView;

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

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

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

为什么只显示一个ImageView

是一个节点。场景图中只能有一个节点实例。见:

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

如何修复它

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

private static final Image ncpic = new Image(
  TabContent.class.getResource(
    "/images/6.jpg"
  ).toExternalForm()
);
注意,对于单个初始化语句,不需要静态块

还要注意,上面的代码将在Java7下工作,但是。如果JavaFX系统在静态代码运行之前已经初始化(例如,应用程序的init或start方法之前已经执行),您将确信代码将在java8中工作

无论何时要重用图像,只需在将其添加到场景之前将其包装到新的ImageView中即可。例如:

pane1.add(new ImageView(ncpic));
pane2.add(new ImageView(ncpic));
现在,图像将同时显示在pane1和pane2中,而不是像您尝试重用单个静态ImageView实例那样仅显示在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;
  }
}

为什么只显示一个ImageView

是一个节点。场景图中只能有一个节点实例。见:

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

如何修复它

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

private static final Image ncpic = new Image(
  TabContent.class.getResource(
    "/images/6.jpg"
  ).toExternalForm()
);
注意,对于单个初始化语句,不需要静态块

还要注意,上面的代码将在Java7下工作,但是。如果JavaFX系统在静态代码运行之前已经初始化(例如,应用程序的init或start方法之前已经执行),您将确信代码将在java8中工作

无论何时要重用图像,只需在将其添加到场景之前将其包装到新的ImageView中即可。例如:

pane1.add(new ImageView(ncpic));
pane2.add(new ImageView(ncpic));
现在,图像将同时显示在pane1和pane2中,而不是像您尝试重用单个静态ImageView实例那样仅显示在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;
  }
}

你如何使用它,在哪里使用它?试着让它成为非静态的。这不是一种方法。这是一个静态初始化块。在我的例子中,java方法被多次调用。它应该是静态的。使静态变量成为getExternalForm的结果(无论是什么类型),并在每次使用它时调用
new ImageView
。如何以及在何处使用它?尝试将其设置为非静态。这不是一种方法。这是一个静态初始化块。在我的例子中,java方法被多次调用。它应该是静态的。将静态变量设置为getExternalForm的结果(无论是什么类型),并在每次使用它时调用
new ImageView
ImageView.clone()
不会编译,因为
clone()
方法具有受保护(非公共)的访问权限。我不认为JavaFX场景图支持克隆JavaFX场景图节点。
imageView.clone()
不会编译,因为
clone()
方法已保护(非公共)访问。我不认为JavaFX场景图支持克隆JavaFX场景图节点。