2013-08-24 63 views
0

我從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類 而第二次。

+1

如何以及在哪裏使用它? –

+2

嘗試將其設置爲非靜態。這不是一種方法。這是一個靜態初始化塊。 –

+0

在我的情況下,java方法被調用很多次。它應該是靜態的。 –

回答

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中運行。

無論何時想要重新使用圖像,只需將其包裝在新的ImageView中,然後將其添加到場景中即可。例如:

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

現在的圖像將顯示在這兩個pane1和pane2,而不是僅僅在pane2,因爲它會如果你試圖重新使用一個靜態的ImageView實例。

示例代碼

從彼得的問題的示例代碼可以改寫爲以下正常工作:

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; 
    } 
} 
2

嘗試在繪製之前克隆該對象:

class ImageManager { 
    public static ImageView imageView; 

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

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

有一個機會,方法的clone()將通過相同的數據參考這個新的實例,而不是重新創造它。所以這將是一個新的對象,但具有相同的資源。

+0

'imageView.clone()'不會像clone()'方法保護(不公開)訪問一樣進行編譯。我不認爲JavaFX場景圖形支持克隆JavaFX場景圖形節點。 – jewelsea