2016-07-26 3 views
1

MenuItem의 아이콘이 필요합니다.JavaFX setGraphic()이 MenuItem의 아이콘을 표시하지 않습니다.

public class IconFactory { 

private static ImageView HLP_BOOK_JFX; 

public enum ICONS { 
    BASCET_REMOVE, BASCET_PUT, SAVE, OPEN, ARROW_RIGHT, ARROW_LEFT, ARROW_UP, ARROW_DOWN, CLOCK, ANALOG_SIGNAL, DIGITAL_SIGNAL, REFRESH, GREEN_PLUS, NETWORK, OK, CANCEL, RIGHT_NAV2, LEFT_NAV2, PLAY, PAUSE, LIST_ADD, PAGE_FIND, SET_PARAM, DOWNLOAD, UPLOAD, LOG_FILE, WARNING, INFO, LOG_DIAG, DATA_TRANS, TREE, FILTER, SEARCH, PARAM, ERASE, RESETDEF, RESETDEF2, DEBUG_BUG, INTERNATIONAL, CLOSE, HLP_BOOK 
} 

public static ImageView getImage(ICONS en) { 
    switch (en) { 
     case HLP_BOOK: 
      if (HLP_BOOK_JFX == null) 
       HLP_BOOK_JFX = new ImageView(new Image(IconFactory.class.getResourceAsStream("help_book.png"))); 
      return HLP_BOOK_JFX; 
    } 
    return null; 
} 

을 나는 그것이 완벽하게 작동하는 단일 메뉴 항목 에 대한 myMenuItem.setGraphic(IconFactory.getImage(ICONS.HLP_BOOK))를 사용하는 경우 :는 "노동자 클래스"아이콘의 ImageView를 얻기 위해 같은

입니다. 저도 같은 그래픽을 루프에서이 개 메뉴를 생성하고 설정하려는 경우

그러나 한 다음, 하나 MenuItem는 표시되지 아이콘이 없습니다. (아래 코드의 첫 번째 루프).


내 코드 : 당신이 볼 수 있듯이

while (keys.hasMoreElements()) { 

    // that will do 2 loops, do not care about how 

    MenuItem subMenuHelp = new MenuItem("MenuItem"); 
    subMenuHelp.setGraphic(IconFactory.getImage(ICONS.HLP_BOOK)); 
    subMenuHelp.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       // do not care 
       openHelpFile(link); 
      } 
    }); 
     System.out.println(((ImageView) subMenuHelp.getGraphic()).toString()); 
     myMenu.getItems().add(subMenuHelp); 
} 

, 나는 그래픽이 현재 항목에 대한 설정되어 있는지 확인하기 위해 System.out.println을 추가했다. 콘솔 결과 : 같은 ImageView에 두 줄 (MenuItem의) :

[email protected][styleClass=image-view] 
[email protected][styleClass=image-view] 

나는 정확히 같은 한 스윙에 (그러나 Icons.setIcons() 기능)과 아주 잘했다. 또한 강제로 표시하는 "다시 그리기"기능을 찾지 만 어떤 방법도 사용하지 않았습니다.

희망을 보내주세요.

답변

3

동일한 Node을 씬 그래프에 여러 번 첨부 할 수없고 동일한 상태 일 때 - 동일한 ImageView 개체를 추가하기 때문입니다. documentation of Node에서

:

는 프로그램 (등 그룹, 지역, 포함) 부모에 자식 노드를 추가하는 경우 해당 노드가 이미 다른 부모의 자식이나의 루트 장면에서 노드는 이전 부모 인 에서 자동으로 (자동으로) 제거됩니다.

이 솔루션은 각 호출에 새로운 ImageView 인스턴스를 반환하거나 Image 인스턴스보다는 ImageView 인스턴스를 (두 번째는 이름이 "Iconfactory에"내 생각에 더 잘 맞는) 반환 IconFactorygetImage 방법을 수정하는 것입니다.

Image 자체를 다시로드하지 않으려면 ImageView을 저장하는 대신 Image 인스턴스를 저장할 수 있습니다.당신은 참조로이 질문을 확인할 수 있습니다 : Reusing same ImageView multiple times in the same scene on JavaFX

가능한 업데이 트를 IconFactory에 :

public class IconFactory { 

    private static HashMap<ICON, Image> images = new HashMap<ICON, Image>(); 

    public enum ICON { 
     BASCET_REMOVE, BASCET_PUT, SAVE, OPEN, ARROW_RIGHT, ARROW_LEFT, ARROW_UP, ARROW_DOWN, CLOCK, ANALOG_SIGNAL, DIGITAL_SIGNAL, REFRESH, GREEN_PLUS, NETWORK, OK, CANCEL, RIGHT_NAV2, LEFT_NAV2, PLAY, PAUSE, LIST_ADD, PAGE_FIND, SET_PARAM, DOWNLOAD, UPLOAD, LOG_FILE, WARNING, INFO, LOG_DIAG, DATA_TRANS, TREE, FILTER, SEARCH, PARAM, ERASE, RESETDEF, RESETDEF2, DEBUG_BUG, INTERNATIONAL, CLOSE, HLP_BOOK 
    } 

    public static Image getImage(ICON en) { 

     if (!images.containsKey(en)) { 
      switch (en) { 
      case HLP_BOOK: 
       images.put(en, new Image(IconFactory.class.getResourceAsStream("help_book.png"))); break; 
      default: 
       return null; 
      } 
     } 
     return images.get(en); 
    } 
} 

사용을 업데이트 후 : 그래서

subMenuHelp.setGraphic(new ImageView(IconFactory.getImage(ICONS.HLP_BOOK))); 
+0

오! 빠른 도움을 주셔서 대단히 감사합니다. 그래서 각 호출시 새로운 ImageView를 반환하도록 IconFactory를 업데이트했으며 완벽하게 작동합니다. –

관련 문제