2016-08-23 49 views
0

如何在fxml中为图像设置事件处理程序。我写了下面这3个图像,我想单击它们,并调用我已经在我的控制器类中创建的函数。我已经尝试过使用鼠标和onAction,他们都不会工作。如何在FXML(Javafx Project)中设置图像监听器?

<ImageView fitHeight="31.0" fitWidth="29.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="1" GridPane.rowIndex="0" > 
      <image > 
     <Image url="@/views/add.png" /> 
     </image> 
     </ImageView> 
    <ImageView fitHeight="31.0" fitWidth="29.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="1" GridPane.rowIndex="1"> 
      <image> 
     <Image url="@/views/remove.png" /> 
     </image> 
     </ImageView> 
    <ImageView fitHeight="31.0" fitWidth="29.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="1" GridPane.rowIndex="2"> 
      <image> 
     <Image url="@/views/edit.png" /> 
     </image> 
     </ImageView> 

我也检出了其他帖子,但他们都说如何做到这一点,当图像的实用定义。 任何建议表示赞赏。

+1

为什么你不选择使用按钮,为CSS图像样式?我认为使用ImageView来达到这个目的将是一个长期的矫枉过正。 – iMan

+0

@iMan是否可以简单地将css添加到fxml内联?如果是的话,我会赞赏一个简单的例子:) –

+0

我已经找到它;)示例:

回答

4

有没有onAction因为ImageView,是不是一个真正的可点击的组件,但没有阻止你听它的鼠标事件,这样你就可以使用onMousePressedorMouseClicked。此外,设置为pickOnBounds为true可确保即使点击图像的透明部分也会触发事件。下面是一个例子FXML文件:

<ImageView onMousePressed="#imageClicked" pickOnBounds="true"> 
    <image> 
     <Image url="http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png"/> 
    </image> 
</ImageView> 

,并在其控制器的相应方法:

@FXML 
public void imageClicked(MouseEvent event) { 
    System.out.println("Clicked: "+event.getSource()); 
} 

结果:

已点击:ImageView的@ 7bf40ff6 [的styleClass =图像的视图]

+0

我的输出是:错误解析onMousePressed ='#imageClicked',或者事件处理程序不在命名空间中,或者脚本中有错误。 :D –

+2

@DanialKosarifa您需要使用带有'imageClicked'方法的控制器,并确保导入'javafx.scene.input.MouseEvent',而不是其他'MouseEvent'类。此外''FXML'注释对于'public'方法是不需要的。 @Dth如果您在网络上使用了一个网址,例如,可以更容易地重现结果。 http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png(在这种情况下使用'pickover_Bounds =“true”',因为图像部分透明)。 – fabian

+0

@fabian确实这样做更有意义,谢谢,我编辑了我的答案。 – Dth

相关问题