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