0

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

private static final ImageView ncpic;    
    static {
        ncpic = new ImageView(TabContent.class.getResource("/images/6.jpg").toExternalForm());
    }

我注意到我只能使用这张图片一次。当我使用它两次时,我称之为它的场景是空的。我怎样才能使用这张图片两次或多次?也许这是由我调用显示图片的静态 java 方法引起的?

PS快速示例:

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 类中。

4

2 回答 2

2

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

class ImageManager {
    public static ImageView imageView;

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

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

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

于 2013-08-24T19:07:35.057 回答
2

为什么只显示一个 ImageView

ImageView是一个节点。场景图形中只能有一个节点实例。请参阅节点文档

如果程序将子节点添加到父节点(包括组、区域等)并且该节点已经是不同父节点的子节点或场景的根节点,则该节点会自动(并且无声地)从其前父节点中删除。

如何修复它

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

private static final Image ncpic = new Image(
  TabContent.class.getResource(
    "/images/6.jpg"
  ).toExternalForm()
);

请注意,仅单个初始化语句不需要静态块。

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

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

pane1.add(new ImageView(ncpic));
pane2.add(new ImageView(ncpic));

现在图像将同时显示在窗格 1 和窗格 2 中,而不是像尝试重用单个静态 ImageView 实例时那样仅显示在窗格 2 中。

示例代码

彼得问题中的示例代码可以重写如下以正常运行:

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-24T22:19:40.070 回答