`
mqqqvpppm
  • 浏览: 63744 次
  • 性别: Icon_minigender_1
  • 来自: Kun Ming
社区版块
存档分类
最新评论

JavaFX对图片上透明部分使用鼠标事件

阅读更多
对JAVAFX来说, 图片上的透明部分的任何鼠标事件都不能捕捉到,听起来有点像是bug, 比如下边这个对像你只能在其图片上不秀明部分触发鼠标事件:
ImageView {
    x: 0;
    y: 0;
    image: Image { url: "{__DIR__}myImage.png"}                    
}   


不过可以通过在增加层透明矩形层的方式来解决问题,因为Rectangle对象就算透明也会相应鼠标事件,如下代码所示
Rectangle {//Glass Pane
    x: 0;
    y: 0;
    width: 20;
    height: 20;
    fill: Color.rgb(0, 0, 0, 0);
}


以下是个在窗口中拖动图片的例子,如图第一张图片只可以拖着不透明的地方拖动,第二张图片可以拖着任何地方(包括透明的部位)来拖动,完整的代码请符见下载(netbeans project)



例子讲解:
Step1.先定义抽象类:
abstract class MyNode extends CustomNode{
    var x: Number = 100;
    var y: Number = 100;
    var xTemp: Number =0;
    var yTemp: Number =0;
    var img = Image { url: "{__DIR__}myImage.png"};
}


Step2.定义两个子类来显示图片,其中一个多加了一层class pane (透明矩形)来触发鼠标事件
如下这个不带class pane:
class MyNodeWithoutGlassPane extends MyNode{    
    public override function create(): Node{
        return Group {
            content: [                            
                ImageView {
                    x: bind x;
                    y: bind y;
                    image: img
                }
                Text{
                    x: bind x;
                    y: bind y;
                    content: "drag me on opaque part"
                }
            ]
        }
    }
}


这个带有class pane:
class MyNodeWithGlassPane extends MyNode{

    public override function create(): Node{
        return Group {
            content: [
                // Background image                
                ImageView {
                    x: bind x;
                    y: bind y;
                    image: img;
                }
                Rectangle {//Glass Pane
                    x: bind x;
                    y: bind y;
                    width: img.width;
                    height: img.height;
                    fill: Color.rgb(0, 0, 0, 0);
                }
                Text{
                    x: bind x;
                    y: bind y;
                    content: "drag me even in transparent part"
                }
            ]
        };
    }
}



Step3, 最后来写main部分,大体就是建出以上两个子类的对象来,给他们set上x,y做标值并对他们绑定数标事件(onMousePressed 和 onMouseDragged),代码如下
Stage {
    scene: Scene {
        content: [
            MyNodeWithoutGlassPane{
                x: 50;
                y: 100;
                onMousePressed: function(event){
                    var myNode = event.node as MyNode;
                    myNode.xTemp = myNode.x;
                    myNode.yTemp = myNode.y;
                }
                onMouseDragged: function(event){
                    var myNode = event.node as MyNode;
                    //println("{event.dragX}   {event.dragY}");
                    myNode.x = myNode.xTemp + event.dragX;
                    myNode.y = myNode.yTemp + event.dragY
                }                
            }
            MyNodeWithGlassPane{
                x: 250;
                y: 250;
                onMousePressed: function(event){
                    var myNode = event.node as MyNode;
                    myNode.xTemp = myNode.x;
                    myNode.yTemp = myNode.y;
                }
                onMouseDragged: function(event){
                    var myNode = event.node as MyNode;
                    //println("{event.dragX}   {event.dragY}");
                    myNode.x = myNode.xTemp + event.dragX;
                    myNode.y = myNode.yTemp + event.dragY
                }
            }
        ]       
    }

    width: 500
    height: 500
    title: "Drag Image"
    resizable: false
}


完了谢谢阅读:) 祝大家愉快 ^^
4
0
分享到:
评论
2 楼 mqqqvpppm 2009-05-17  
javafxguy 写道

在我编写的JavaFX许愿树程序中,许愿树就是有透明部分,在点击树身时才响应动作。

javafxguy 兄多谢指点我最近忙没搞javafx, 有空一定把你的blog精读一边,学习javafx!
1 楼 javafxguy 2009-05-16  
很好的办法,非常简单、容易实现。

不过我觉得透明部分不响应鼠标事件也是正常的,不是BUG。例如,在图层叠加的情况下,如果透明部分也响应事件,那么在点击下层的对象时就容易误操作了。

在我编写的JavaFX许愿树程序中,许愿树就是有透明部分,在点击树身时才响应动作。

相关推荐

    不规则形状的透明对话框

    透明对话框则是指对话框的某些部分或全部具有半透明效果,这使得对话框不会完全遮挡其下的内容。在Windows系统中,我们可以使用Alpha通道来实现透明效果,Alpha通道是一个额外的颜色通道,用于定义颜色的透明度,0...

    窗口背景透明滚动字幕源码

    1. **图形用户界面(GUI)编程**:理解窗口组件、事件处理(如鼠标点击、滚动等)以及如何在界面上添加和操作元素。 2. **透明度控制**:利用编程语言提供的图形库或API(如OpenGL, DirectX, Qt, wxWidgets, JavaFX...

    一个简易的画图板代码

    2. **事件处理**:当用户在画图板上进行操作时,比如点击鼠标或移动鼠标,程序需要捕获这些事件并做出响应。这涉及到事件监听器和回调函数,当特定事件发生时,回调函数会被调用执行相应的操作,如绘制线条或改变...

    图片正启动水波纹还有特效任务栏添加图片等功能

    实现这一效果可以利用图形库中的图层叠加、透明度变化和时间函数,例如在Android中使用自定义View或Canvas,iOS中使用Core Animation框架。 3. **任务栏添加图片功能**:任务栏是操作系统界面的重要组成部分,用户...

    基于java的实现的放大镜效果附有源文件.zip

    当用户将鼠标移动到这个窗口上时,就像用放大镜观察物体一样,能看到更细致的图像部分。 在Java中,我们可以使用Swing或JavaFX库来创建GUI组件并实现放大镜效果。这个项目很可能使用了Swing,因为它是Java标准版的...

    pngbutton按钮

    例如,在Java中,可以使用Swing或JavaFX库来加载PNG图像并将其应用到按钮组件上,保持按钮的透明部分不显示背景。在Web开发中,HTML5和CSS3可以实现类似的效果,通过设置`background-image`属性引用PNG图片,并利用`...

    利用绘图和Timer做出来的在图像上可以移动的框架

    在计算机编程领域,尤其是图形用户界面(GUI)开发中...4. 透明度控制:调整组件的透明度属性,使框架能够部分透明,允许背景内容可见。 理解并掌握这些知识点,将有助于开发者构建具有交互性和动态性的GUI应用程序。

    不规则的图片按钮(重写按钮的形貌)

    总结来说,"不规则的图片按钮(重写按钮的形貌)"是一个关于如何使用图像和编程技术来创造独特、具有吸引力的用户界面元素的主题。它涉及到图形设计、用户交互和编程技术的结合,是提升应用视觉效果和用户体验的重要...

    win7 标题栏 按钮图片资源

    例如,在使用HTML、CSS和JavaScript构建网页应用时,可以使用CSS的`background-image`属性设置按钮的背景图片,而在桌面应用开发中,如使用JavaFX或.NET Framework,可以将这些图片作为控件的皮肤进行应用。...

    PaintFX:用 JavaFX 编写的绘制程序的类项目

    "PaintFX" 是一个使用 JavaFX 编写的绘图程序项目,它允许用户在屏幕上自由绘制,实现基本的绘画和图像编辑功能。这个类项目可能包含以下特性: 1. **画笔工具**:提供不同颜色、粗细和透明度的画笔,让用户可以...

    picture_change.zip_滚动条

    5. **事件监听**:设置滚动条的滚动事件监听器,当滑块位置改变时,根据滚动条的值更新图片在`PICTURE控件`中的显示范围。 6. **平移操作**:计算滚动条的新位置对应的图片显示区域,然后更新`PICTURE控件`的显示,...

    连连看游戏源代码(属于自己设计的)

    1. **图形用户界面(GUI)**:在Java中,可以使用Swing或JavaFX库来构建连连看游戏的界面。用户界面需要包含游戏面板、计时器、分数显示、操作提示等元素。这些元素通常由JPanel、JButton、JLabel等组件组成,通过布局...

    实现控件拖动有时需要拖动控件的位置,以便客户自定义。

    1. **事件处理**:在大多数UI框架或库中,如Windows Forms、WPF、Qt、JavaFX、Android、iOS等,都有专门的拖放事件处理机制。例如,开发者需要监听`MouseDown`、`MouseMove`和`MouseUp`事件,以跟踪用户是否开始拖动...

    java 编写的画图软件

    在“Java 画图”这个标签中,我们可以推测软件的核心部分可能涉及到Java的Swing或JavaFX库来构建图形用户界面,这两个库提供了丰富的组件和工具,用于创建复杂的交互式应用。Swing是早期的GUI库,而JavaFX则更现代,...

    QQMenu完美实现

    在Java Swing或JavaFX等图形用户界面(GUI)库中,我们可以使用特定组件来实现这样的功能。 "TextPane"是Java Swing中的一种组件,主要用于显示和编辑多行文本。它支持基本的格式化,如字体、大小和颜色的改变,但...

    刮刮乐demo 源码

    这通常需要使用到前端技术,如JavaFX、Qt或Android Studio中的布局管理器。 2. **随机数生成**:中奖信息的生成是随机的,这需要利用编程语言内置的随机数生成函数。例如,在Java中可以使用`java.util.Random`类,...

    用JAVA编制Internet电子白板软件.rar

    标题中的“用JAVA编制Internet电子白板软件”指的是使用Java编程语言开发的一款可以在互联网上使用的交互式电子白板应用程序。这种软件通常允许用户在虚拟的白板上进行绘图、书写、标注,甚至进行协作,适用于远程...

    飞机大战游戏java实现

    2. **事件处理**:游戏中的交互,如玩家控制飞机移动、射击等,都需要监听键盘或鼠标事件。Java的AWT和Swing库提供了事件监听机制,通过实现EventListener接口和相关的事件处理方法,我们可以捕捉到用户的输入并作出...

    简单俄罗斯方块俄罗斯(里面含有源代码,并且有可执行的文件)

    每种语言都有其特定的语法和库,例如C++可能使用SFML或SDL库,Python可能使用Pygame,Java可能使用JavaFX或Swing。 3. **图形用户界面**:游戏界面包括方块显示区域、得分显示、控制按钮等元素。这通常需要对GUI...

Global site tag (gtag.js) - Google Analytics