我有来自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中。
发布于 2013-08-24 22:19:40
为什么只有一个ImageView显示
ImageView是一个节点。在SceneGraph中,只能有一个节点的实例。见节点文档
如果程序将子节点添加到父节点(包括组、区域等),并且该节点已经是另一个父节点的子节点或场景的根,则该节点将自动(并且是静默地)从以前的父节点中删除。
如何修复It
如果要在多个节点之间共享图像数据,可以这样做。例如。
private static final Image ncpic = new Image(
TabContent.class.getResource(
"/images/6.jpg"
).toExternalForm()
);注意,只需要一个初始化语句就不需要静态块。
还请注意,上述代码将在Java7下工作,但适用于在当前Java 8早期访问版本下可能会失败。您将确信,如果JavaFX系统是在静态代码运行之前首先初始化的(例如,您的应用程序的init或start方法以前已经执行过),那么代码将在Java8中工作。
每当您想要重用图像时,只需将其包装在一个新的ImageView中,然后再将它添加到场景中。例如:
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;
}
}发布于 2013-08-24 19:07:35
在绘制对象之前,尝试克隆它:
class ImageManager {
public static ImageView imageView;
static {
imageView = new ImageView(...);
}
public static ImageView getImageView() {
return imageView.clone();
}
}方法克隆()有可能将相同的数据引用传递给这个新实例,而不是再次创建它。因此它将是一个新的对象,但具有相同的资源。
https://stackoverflow.com/questions/18421952
复制相似问题