2014-05-14 1 views
0

타일 또는 흐름 창에서 개별 요소에 작업 수신기를 추가 할 수 있습니까?타일 패널의 개별 요소에 작업 수신기를 추가하는 방법

예를 들어, 아래 예에서 사용자가 이미지를 클릭하면 시스템이 위치/파일 경로를 인쇄합니다.

고맙습니다.

public class FlowTileExample extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     VBox root = new VBox(30); 

     //loading images 
     Image[] im = new Image[8]; 
     im[0] = new Image(getClass().getResourceAsStream("facebook.png")); 
     im[1] = new Image(getClass().getResourceAsStream("faviicon.png")); 
     im[2] = new Image(getClass().getResourceAsStream("jquery-logo.png")); 
     im[3] = new Image(getClass().getResourceAsStream("linkedin_32.png")); 
     im[4] = new Image(getClass().getResourceAsStream("loading1.png")); 
     im[5] = new Image(getClass().getResourceAsStream("twitter.png")); 
     im[6] = new Image(getClass().getResourceAsStream("twitter_32.png")); 
     im[7] = new Image(getClass().getResourceAsStream("wp.png")); 

     VBox up = new VBox(20); 
     Text text4flow = new Text("Images in FlowPane"); 
     text4flow.setFont(Font.font("Calibri", FontWeight.BOLD, 30)); 
     text4flow.setUnderline(true); 
     VBox.setMargin(text4flow, new Insets(10, 0, 0, 10)); 
     //creating Flow Pane 
     FlowPane flowpane = new FlowPane(); 
     flowpane.setHgap(5); 
     flowpane.setVgap(5); 
     for (int i = 0; i < 8; i++) { 
      flowpane.getChildren().add(new ImageView(im[i])); 
     } 

     up.getChildren().addAll(text4flow, flowpane); 

     VBox down = new VBox(20); 
     Text text4tile = new Text("Images in TilePane"); 
     text4tile.setFont(Font.font("Calibri", FontWeight.BOLD, 30)); 
     text4tile.setUnderline(true); 
     VBox.setMargin(text4tile, new Insets(10, 0, 0, 10)); 

     //creating Tile Pane 
     TilePane tilepane = new TilePane(); 
     tilepane.setHgap(5); 
     flowpane.setVgap(5); 
     for (int i = 0; i < 8; i++) { 
      tilepane.getChildren().add(new ImageView(im[i])); 
     } 
     down.getChildren().addAll(text4tile, tilepane); 
     root.getChildren().addAll(up, down); 
     primaryStage.setTitle("Flow And Tile Panes Example"); 
     Scene scene = new Scene(root, 500, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

짧은 대답은 '예'입니다. 긴 대답은 더 많은 맥락을 포함 할 것이다. 'ImageView'는 실제로 "액션 리스너"컨텍스트가 없지만 마우스와 키 입력이 있습니다 ... – MadProgrammer

+0

답장을 보내 주셔서 감사합니다 [@MadProgrammer] (http://stackoverflow.com/users/992484/madprogrammer) . 마우스와 키 입력으로 어떻게 할 수 있습니까? – user3625142

답변

1

당신은 예를 들어, ImageView 인스턴스 처리기의 어떤 종류를 추가 할 필요가 ...

ImageView imageView = new ImageView(im[i]); 
imageView.setOnMouseClicked(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent t) { 
     System.out.println("Oh dear lord, they clicked me!?"); 
    } 
}); 

아니면 일반 핸들러를 만들 수 있습니다 ...

EventHandler mouseHandler = new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent t) { 
     ImageView imageView = (ImageView) t.getSource(); 
     System.out.println("You clicked " + imageView.getImage()); 
    } 
}; 

for (int i = 0; i < 8; i++) { 
    ImageView imageView = new ImageView(im[i]); 
    imageView.setOnMouseClicked(mouseHandler); 
    flowpane.getChildren().add(imageView); 
} 

들어 예 ...

Handling JavaFX Events fo를 자세히 살펴보아야합니다. 세부 정보

+0

정말 고마워요 [@MadProgrammer] (http://stackoverflow.com/users/992484/madprogrammer). 내가 이것을 공부하게 해줘. 충분한 점수를 얻었다면 나는 당신에게 투표 할 것입니다. 나중에 당신의 대답을 받아 들일 것입니다. 당분간은 질문을 공개하지 않겠습니다. 다시 감사합니다. – user3625142

1

MadProgrammer에 추가 된 것처럼 사용자 지정 데이터를 빠르게 관리하기 위해 자체 데이터 모델을 만드는 대신 노드의 userData 속성을 활용할 수 있습니다. userData에는 관련 노드와 일부 컨텍스트 데이터를 첨부와 같이 다양한 상황에서 사용할 수 있습니다 :

VBox root = new VBox(); 
final Glow glow = new Glow(); 

EventHandler<MouseEvent> handlerMouseClicked = (MouseEvent t) -> { 
    System.out.println("url = " + ((ImageView) t.getSource()).getUserData()); 
}; 

EventHandler<MouseEvent> handlerMouseEntered = (MouseEvent t) -> { 
    ((ImageView) t.getSource()).setEffect(glow); 
}; 

EventHandler<MouseEvent> handlerMouseExited = (MouseEvent t) -> { 
    ((ImageView) t.getSource()).setEffect(null); 
}; 

String[] imageNames = {"rere.png", "rere_1.png", "rere_2.png"}; 
for (String imageName : imageNames) { 
    String url = getClass().getResource(imageName).toExternalForm(); 
    ImageView iv = new ImageView(new Image(url)); 
    iv.setUserData(url); 
    iv.setOnMouseEntered(handlerMouseEntered); 
    iv.setOnMouseExited(handlerMouseExited); 
    iv.setOnMouseClicked(handlerMouseClicked); 
    root.getChildren().add(iv); 
} 
+0

당신은 이것을 할 수 있습니다; 나는 당신이 왜 그래야하는지 결코 정말로 이해하지 못했다. 이벤트 처리기에서 직접 데이터에 대한 참조를 쉽게 사용할 수 있습니다 (예 : 'onMouseClicked' 핸들러에서'System.out.println ("url ="+ url)'을 수행하십시오. (이것은 암시 적으로 익명 이벤트 핸들러 객체에 노드의 userData 속성을 유지하는 대신 url을 전달합니다. 이점은 downcast가 필요하지 않고 유형을 유지하는 것입니다.) –

+0

요점이 맞습니다. 그러나 "MadProgrammer에 추가로"라고 말하면 모든 이미지 뷰로 설정할 수있는 공통 처리기를 언급하려고했습니다. 또한 내 주된 목적은 관련 상황에 맞는 노드를 연결하는 것과 같은 상황에서 사용할 수있는 userData를 표시하는 것이 었습니다. –

관련 문제