我有来自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。
答案 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;
}
}