如何更有效地编写代码以用于不同类型的JavaFX GUI组件?

时间:2016-10-27 22:43:03

标签: java javafx

我正在制作一个基本的JavaFX GUI,当我将鼠标悬停在不同类型的GUI组件上时,我希望标签能够改变。

例如下面,我希望我的标签可以更改来自“无聊”的文字。徘徊!'当我将鼠标悬停在ComboBox,TextField,Button,Circle等上时

我猜测我可以创建一个以对象作为输入参数的方法,而不是重复重复相同的代码,但我似乎无法正确理解它。

基本上,是否有一种优雅的方式可以调整此代码,以便它可以重用于所有类型的不同JavaFX GUI组件?

以下代码目前完全按照我的描述进行,但我想提高效率。

感谢。

        comboBox.setOnMouseEntered(new EventHandler<MouseEvent>() {
          @Override public void handle(MouseEvent mouseEvent) {
            label.setCursor(Cursor.HAND);
            label.setText("Hovered!");
          }
        });
        comboBox.setOnMouseExited(new EventHandler<MouseEvent>() {
          @Override public void handle(MouseEvent mouseEvent) {
            label.setCursor(Cursor.MOVE);
            label.setText("Bored");
          }
        });

        textField.setOnMouseEntered(new EventHandler<MouseEvent>() {
              @Override public void handle(MouseEvent mouseEvent) {
                label.setCursor(Cursor.HAND);
                label.setText("Hovered!");
              }
            });
        textField.setOnMouseExited(new EventHandler<MouseEvent>() {
          @Override public void handle(MouseEvent mouseEvent) {
            label.setCursor(Cursor.MOVE);
            label.setText("Bored");
          }
        });

        button.setOnMouseEntered(new EventHandler<MouseEvent>() {
              @Override public void handle(MouseEvent mouseEvent) {
                label.setCursor(Cursor.HAND);
                label.setText("Hovered!");
              }
            });
        button.setOnMouseExited(new EventHandler<MouseEvent>() {
          @Override public void handle(MouseEvent mouseEvent) {
            label.setCursor(Cursor.MOVE);
            label.setText("Bored");
          }
        });

        circle.setOnMouseEntered(new EventHandler<MouseEvent>() {
              @Override public void handle(MouseEvent mouseEvent) {
                label.setCursor(Cursor.HAND);
                label.setText("Hovered!");
              }
            });
        circle.setOnMouseExited(new EventHandler<MouseEvent>() {
          @Override public void handle(MouseEvent mouseEvent) {
            label.setCursor(Cursor.MOVE);
            label.setText("Bored");
          }
        });

2 个答案:

答案 0 :(得分:2)

您可以轻松使用辅助方法注册所有这些侦听器。此外,您可以重用侦听器,因为它们包含所有节点的相同代码:

private static void registerListeners(final Label label, Node... nodes) {
    final EventHandler<MouseEvent> enteredHandler = new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            label.setCursor(Cursor.HAND);
            label.setText("Hovered!");
        }
    };

    final EventHandler<MouseEvent> exitedHandler = new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {
            label.setCursor(Cursor.MOVE);
            label.setText("Bored");
        }
    };

    // add listeners to all nodes
    for (Node n : nodes) {
         n.setOnMouseEntered(enteredHandler);
         n.setOnMouseExited(exitedHandler);
    }
}
registerListeners(label, comboBox, textField, button);

请注意,您无法处理父节点上的MOUSE_ENTEREDMOUSE_EXITED事件,因为事件未通过层次结构传递。使任意子项工作的唯一方法是处理父项上的MOUSE_MOVED事件。在这种情况下,您无法确定相交节点是您要允许的节点之一。它可能是一个孩子。因此,您需要自己遍历层次结构:

commonAncestor.setOnMouseEntered(evt -> {
    Node n = evt.getPickResult().getIntersectedNode();
    while (n != commonAncestor) {
        if (checkNode(n)) {
            label.setCursor(Cursor.HAND);
            label.setText("Hovered!");
            return;
        }
        n = n.getParent();
    }

    label.setCursor(Cursor.MOVE);
    label.setText("Bored");
});

答案 1 :(得分:0)

我真的不知道这是不是最好的答案。但你可以试试这个:

@Override
public void initialize(URL location, ResourceBundle resources) {
combobox.setOnMouseEntered(this);
    combobox.setOnMouseExited(this);
    textfield.setOnMouseEntered(this);
    textfield.setOnMouseExited(this);
    button.setOnMouseEntered(this);
    button.setOnMouseExited(this);

}

@Override
public void handle(MouseEvent event) {
    switch (event.getEventType().getName()){
        case "MOUSE_ENTERED":
            label.setCursor(Cursor.HAND);
            label.setText("Hovered!");
            break;
        case "MOUSE_EXITED":
            label.setCursor(Cursor.MOVE);
            label.setText("Bored");
            break;
    }
}

您的控制器必须实现EventHandler