当前位置: 首页 > 知识库问答 >
问题:

使用FXML在JavaFX中向标签添加鼠标单击动作事件

赫连宏伯
2023-03-14

我在JavaFX中制作了一个版本的风险。现在,为了显示游戏数据,我正在使用标签网格来显示有关每个区域的信息。我现在想在标签上有鼠标点击侦听器,这样我就可以通过点击它们来测试游戏功能,直到我制作了完整的游戏板。除非我尝试在FXML文档中添加侦听器,否则我会收到错误。现在,我正在控制器中声明标签,将它们添加到集合中,以便我可以使用循环绑定每个标签的文本属性,然后将每个标签添加到网格中。然后在FXML中,我为每个定义onMouseClicked的地方。下面是控制器代码:

@FXML
private GridPane tGrid = new GridPane();

@FXML Label label1 = new Label();
@FXML Label label2 = new Label();
@FXML Label label3 = new Label();
@FXML Label label4 = new Label();
@FXML Label label5 = new Label();
@FXML Label label6 = new Label();
@FXML Label label7 = new Label();
@FXML Label label8 = new Label();
@FXML Label label9 = new Label();
@FXML Label label10 = new Label();
@FXML Label label11 = new Label();
@FXML Label label12 = new Label();
@FXML Label label13 = new Label();
@FXML Label label14 = new Label();
@FXML Label label15 = new Label();
@FXML Label label16 = new Label();
@FXML Label label17 = new Label();
@FXML Label label18 = new Label();
@FXML Label label19 = new Label();
@FXML Label label20 = new Label();
@FXML Label label21 = new Label();
@FXML Label label22 = new Label();
@FXML Label label23 = new Label();
@FXML Label label24 = new Label();
@FXML Label label25 = new Label();
@FXML Label label26 = new Label();
@FXML Label label27 = new Label();
@FXML Label label28 = new Label();
@FXML Label label29 = new Label();
@FXML Label label30 = new Label();
@FXML Label label31 = new Label();
@FXML Label label32 = new Label();
@FXML Label label33 = new Label();
@FXML Label label34 = new Label();
@FXML Label label35 = new Label();
@FXML Label label36 = new Label();
@FXML Label label37 = new Label();
@FXML Label label38 = new Label();
@FXML Label label39 = new Label();
@FXML Label label40 = new Label();
@FXML Label label41 = new Label();
@FXML Label label42 = new Label();


@Override
public void initialize(URL url, ResourceBundle rb) {
    anchor.setLeftAnchor(tGrid, 10.0);
    anchor.setRightAnchor(pGrid, 10.0);
    tGrid.setVisible(false);
    pGrid.setVisible(false);
    labels.add(label1);
    labels.add(label2);
    labels.add(label3);
    labels.add(label4);
    labels.add(label5);
    labels.add(label6);
    labels.add(label7);
    labels.add(label8);
    labels.add(label9);
    labels.add(label10);
    labels.add(label11);
    labels.add(label12);
    labels.add(label13);
    labels.add(label14);
    labels.add(label15);
    labels.add(label16);
    labels.add(label17);
    labels.add(label18);
    labels.add(label19);
    labels.add(label20);
    labels.add(label21);
    labels.add(label22);
    labels.add(label23);
    labels.add(label24);
    labels.add(label25);
    labels.add(label26);
    labels.add(label27);
    labels.add(label28);
    labels.add(label29);
    labels.add(label30);
    labels.add(label31);
    labels.add(label32);
    labels.add(label33);
    labels.add(label34);
    labels.add(label35);
    labels.add(label36);
    labels.add(label37);
    labels.add(label38);
    labels.add(label39);
    labels.add(label40);
    labels.add(label41);
    labels.add(label42);
    int k = 0;
    for(int i = 0; i < 6; i++) {
        for(int j = 0; j < game.getContinent(i).getTerritoryNum(); j++) {
            labels.get(k).textProperty().bind(game.getContinent(i).getTerritory(j).getProperty());
            k += 1;
        }//for
    }//for
    for (int i = 0; i < 42; i++) {
        tGrid.add(labels.get(i), 0, i);
    }//for

这是FXML代码(除了所有标签都会有onMouseClicked):

         <Label fx:id="label1"onMouseClicked="#labelAction" />
            <Label fx:id="label2"/>
            <Label fx:id="label3"/>
            <Label fx:id="label4"/>
            <Label fx:id="label5"/>
            <Label fx:id="label6"/>
            <Label fx:id="label7"/>
            <Label fx:id="label8"/>
            <Label fx:id="label9"/>
            <Label fx:id="label10"/>
            <Label fx:id="label11"/>
            <Label fx:id="label12"/>
            <Label fx:id="label13"/>
            <Label fx:id="label14"/>
            <Label fx:id="label15"/>
            <Label fx:id="label16"/>
            <Label fx:id="label17"/>
            <Label fx:id="label18"/>
            <Label fx:id="label19"/>
            <Label fx:id="label20"/>
            <Label fx:id="label21"/>
            <Label fx:id="label22"/>
            <Label fx:id="label23"/>
            <Label fx:id="label24"/>
            <Label fx:id="label25"/>
            <Label fx:id="label26"/>
            <Label fx:id="label27"/>
            <Label fx:id="label28"/>
            <Label fx:id="label29"/>
            <Label fx:id="label30"/>
            <Label fx:id="label31"/>
            <Label fx:id="label32"/>
            <Label fx:id="label33"/>
            <Label fx:id="label34"/>
            <Label fx:id="label35"/>
            <Label fx:id="label36"/>
            <Label fx:id="label37"/>
            <Label fx:id="label38"/>
            <Label fx:id="label39"/>
            <Label fx:id="label40"/>
            <Label fx:id="label41"/>
            <Label fx:id="label42"/>

错误是这样的:

Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$152(LauncherImpl.java:182)
at com.sun.javafx.application.LauncherImpl$$Lambda$50/1343441044.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: javafx.fxml.LoadException:
file:/C:/Users/Brent/Documents/NetBeansProjects/RiskFXML/dist/run1282679996/RiskFXML.jar!/riskfxml/FXML.fxml:34

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2605)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2547)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2445)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3218)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3179)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3152)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3128)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3108)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3101)
at riskfxml.RiskFXML.start(RiskFXML.java:22)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(LauncherImpl.java:863)
at com.sun.javafx.application.LauncherImpl$$Lambda$53/1527242123.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl$$Lambda$45/355629945.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$170(PlatformImpl.java:295)
at com.sun.javafx.application.PlatformImpl$$Lambda$48/1753953479.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(PlatformImpl.java:294)
at com.sun.javafx.application.PlatformImpl$$Lambda$47/1915503092.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(WinApplication.java:101)
at com.sun.glass.ui.win.WinApplication$$Lambda$36/1963387170.run(Unknown Source)
... 1 more
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[34,38]
Message: Element type "Label" must be followed by either attribute specifications, ">" or "/>".
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:601)
at javax.xml.stream.util.StreamReaderDelegate.next(StreamReaderDelegate.java:88)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2517)
... 22 more
Exception running application riskfxml.RiskFXML
Java Result: 1

更新

好的,所以我删除了所有的' = new Label()',这消除了错误,因为问题是在fxml和控制器中定义它们时,我试图添加重复的元素。现在我的问题是,如何在fxml中的gridpane中添加标签,位置与我在示例控制器代码底部的那个循环中添加标签的位置相同?把它们添加到fxml的arraylist中,然后直接添加就行了吗?我知道我能做的

<Label fx:id="label1" onMouseClicked="#labelAction" GridPane.columnIndex="0" GridPane.rowIndex="0" />

对于每个标签,但必须有一种比手动键入和放置每个标签更好的方法吗?它们只需要在递增的行中的同一列中。

共有1个答案

吴山
2023-03-14

我面临着一个与您类似的问题,并以不同的方式解决了它:在标签顶部创建一个按钮并将不透明度分配为0。

这样,按钮不会显示给最终用户,但当他们单击标签时,底层按钮会拾取操作。由于它是标准的javafx Button,您只需使用onAction="#yourAction",甚至无需更改标签中的任何内容。

希望这有帮助!

 类似资料:
  • 所以我有这个anchorpane,我希望为第二个鼠标键添加一个鼠标listner。我尝试了以下方法,但我一直得到一个错误,有人知道问题是什么吗? 为了记录在案,我也尝试过这样做: 绑定不匹配:MouseButton类型不能有效替代EventHandler类型的有界参数

  • 问题内容: 我正在尝试在matplotlib中实现一个简单的鼠标单击事件。我希望绘制一个图,然后使用鼠标选择积分的上限和下限。到目前为止,我可以将坐标打印到屏幕上,但不能将其存储以供以后在程序中使用。我也想在第二次单击鼠标后退出与该图的连接。 下面是当前绘制并打印坐标的代码。 我的问题: 如何存储图形到列表的坐标?即点击= [xpos,ypos] 是否可以获取两组x坐标以便对该行的该部分进行简单的

  • 所以我开始在我的应用程序中为不同的功能设置键,我想知道是否有一种方法可以设置鼠标左键或右键来执行某些操作?我在keycode.java中找不到任何鼠标事件,我不知道如何应用它。 下面是我的代码: 我要完成的是使右键点击你的鼠标按钮停止移动,左键点击再次开始。我该怎么做?谢谢你。

  • 实际上,我想使用Javafx中的标签创建一个导航列表。我可以为每个标签分配fx: id并在控制器类中创建标签。 但我想做的是,我想在控制器类中创建一个标签数组,而不是控制器类中的十个标签对象,这是我在场景生成器中创建的。 谁能帮我想个办法。。。

  • 或者 我还尝试在没有文件的情况下实现这一点,结果成功了。 如何添加带有文件的应用程序图标?

  • 我是javafx新手,目前正在做菜单,menuitems。我希望覆盖显示上下文菜单的默认事件,即使菜单没有被按下,但鼠标悬停在它上面,而相邻菜单的上下文菜单显示时,当前仍会显示。这发生在每个应用程序中,因为它非常方便。但由于某种原因,我不需要它。我试图捕获菜单上的鼠标事件,这样我就可以相应地工作,但什么也没发生。 这里是我想要添加此行为的菜单。