首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何向Tile Pane中的单个元素添加操作侦听器

如何向Tile Pane中的单个元素添加操作侦听器
EN

Stack Overflow用户
提问于 2014-05-14 07:32:28
回答 2查看 1.3K关注 0票数 0

是否可以在Tile或Flow窗格中向不可分割的元素添加操作侦听器?

例如,在下面的示例中,如果用户单击图像,系统将打印位置/文件路径。

谢谢大家。

代码语言:javascript
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-14 07:52:38

您需要向ImageView实例添加某种处理程序,例如.

代码语言:javascript
复制
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!?");
    }
});

或者你可以创建一个通用处理程序..。

代码语言:javascript
复制
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);
}

例如..。

有关更多细节,您应该仔细查看处理JavaFX事件

票数 1
EN

Stack Overflow用户

发布于 2014-05-14 08:08:15

作为MadProgrammer的一个补充,为了快速管理自定义数据,您可以使用节点的userData属性,而不是构建自己的数据模型。userData可以在不同的情况下使用,比如在相关节点上附加一些上下文数据:

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23648272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档