热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

鼠标进入时更改对象颜色,并在JavaFx出现时将其更改回来

如何解决《鼠标进入时更改对象颜色,并在JavaFx出现时将其更改回来》经验,为你挑选了1个好方法。

根是Group和3个孩子被添加到组中:来自Rectangle类的正方形,来自类的三角形Polygon和来自类的圆Circle.这三个对象都是用不同的颜色构建的.

任务:当鼠标位于特定对象上时,更改该对象的颜色.如果鼠标不在该对象上,颜色将会改变.

这是我做的:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;


public class ColouredShapes extends Application{
public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) {
    Group group = new Group();
    // square
    Rectangle square = new Rectangle(40,40);
    square.setFill(Color.BLUE);
    // triangle
    Polygon triangle = new Polygon();
    triangle.setLayoutX(80);
    triangle.getPoints().addAll(
            40.0,0.0,
            80.0,40.0,
            0.0,40.0
    );
    triangle.setFill(Color.RED);
    //circle
    Circle circle = new Circle(20);
    circle.setLayoutX(240);
    circle.setCenterY(20);

    // ************** where everything happens *****************
    group.onMouseMovedProperty().set(new EventHandler() {
        @Override
        public void handle(MouseEvent event) {
            System.out.printf("coordinate X: %.2f, coordinate Y: %.2f\n",event.getX(),event.getY());
            System.out.println(event.getSource());

            if (event.getSource() instanceof Rectangle) {
                square.setFill(Color.MAGENTA);
            } else square.setFill(Color.BLUE);
        }
    });


    group.getChildren().add(circle);
    group.getChildren().add(triangle);
    group.getChildren().add(square);

    Scene scene = new Scene(group,700,500);
    primaryStage.setScene(scene);
    primaryStage.show();

} }

问题是event.getSource()返回结果Group@52d9d54c[styleClass=root]而不是其子类的结果.因此,无法识别儿童,当鼠标移动到该儿童时,颜色不会改变.



1> James_D..:

event.getSource()返回触发事件的节点,在这种情况下是Group,因为那是您注册处理程序的节点.

而是在每个单独节点上使用onMouseEnteredonMouseExited处理程序:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;

public class ColoredShapes extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        Group group = new Group();
        // square
        Rectangle square = new Rectangle(40, 40);
        square.setFill(Color.BLUE);
        // triangle
        Polygon triangle = new Polygon();
        triangle.setLayoutX(80);
        triangle.getPoints().addAll(40.0, 0.0, 80.0, 40.0, 0.0, 40.0);
        triangle.setFill(Color.RED);
        // circle
        Circle circle = new Circle(20);
        circle.setLayoutX(240);
        circle.setCenterY(20);

        registerHandler(square, Color.BLUE, Color.MAGENTA);
        registerHandler(triangle, Color.RED, Color.MAGENTA);
        registerHandler(circle, Color.BLACK, Color.MAGENTA);

        group.getChildren().add(circle);
        group.getChildren().add(triangle);
        group.getChildren().add(square);

        Scene scene = new Scene(group, 700, 500);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    private void registerHandler(Shape s, Color defaultColor, Color hoverColor) {
        s.setOnMouseEntered( e -> s.setFill(hoverColor));
        s.setOnMouseExited(e -> s.setFill(defaultColor));
    }

}

您也可以在不使用事件处理程序的情况下执行此操作.使用绑定:

square.fillProperty().bind(Bindings
    .when(square.hoverProperty())
    .then(Color.MAGENTA)
    .otherwise(Color.BLUE));

或使用CSS:

square.getStyleClass().add("square");

然后在外部CSS文件中:

.square {
    -fx-fill: blue ;
}
.square:hover {
    -fx-fill: magenta ;
}


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
author-avatar
ze602
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有