繁体   English   中英

JavaFX和SceneBuilder-当它是MenuItem时无法获取事件的来源

JavaFX and SceneBuilder -can't get the source of the event when it is a MenuItem

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

早上好,我正在做一个项目,但是有问题。 实际上,我使用SceneBuilder制作了MenuItems和Buttons,并且添加了一种方法“ ouvrir”,当我们单击按钮或menuItems时应将其激活。 实际上,我使用事件源的ID来打开选项卡。 此方法适用于按钮,但不适用于MenuItem。 当我单击MenuItem时,它会产生一个错误。

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.control.MenuItem.fire(MenuItem.java:462)
    at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1405)
    at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.lambda$createChildren$343(ContextMenuContent.java:1358)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:432)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
    at com.sun.glass.ui.View.notifyMouse(View.java:937)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Thread.java:748)
Caused by: 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:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
    ... 43 more
Caused by: java.lang.ClassCastException: javafx.scene.control.MenuItem cannot be cast to javafx.scene.Node
    at app_views.app_comptabilite.FXMLDocumentController.ouvrir(FXMLDocumentController.java:227)
    ... 53 more

这是控制器的源代码。 有关的方法(“ ouvrir”)在代码的末尾。

import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.AnchorPane;
public class FXMLDocumentController implements Initializable {

@FXML
private MenuBar barre_menu;

@FXML
private Menu menu_fichier;

@FXML
private MenuItem menu_nouvel_article;

@FXML
private MenuItem menu_charger;

@FXML
private MenuItem menu_enregistrer;

@FXML
private MenuItem menu_quitter;

@FXML
private Menu menu_action;

@FXML
private MenuItem action_vente;

@FXML
private MenuItem action_achat;

@FXML
private Menu menu_versement;

@FXML
private MenuItem versement_credit;

@FXML
private MenuItem versement_débit;

@FXML
private Menu menu_listes;

@FXML
private MenuItem liste_vente;

@FXML
private MenuItem liste_achat;

@FXML
private MenuItem liste_article;

@FXML
private MenuItem liste_produit;

@FXML
private MenuItem liste_crédit;

@FXML
private MenuItem liste_débit;

@FXML
private MenuItem liste_facture;

@FXML
private MenuItem liste_bon_de_commande;

@FXML
private Menu menu_compte;

@FXML
private Menu menu_utilisateur;

@FXML
private MenuItem liste_utilisateurs;


@FXML
private MenuItem ajouter_utilisateur;

@FXML
private Menu menu_aide;

@FXML
private MenuItem aide_dicdaticiel;

@FXML
private MenuItem aide_apropos;

@FXML
private Tab tab_accueil;

@FXML
private ToggleButton tool_accueil;
@FXML
private ToggleGroup groupe_toggle;
@FXML
private ToggleButton tool_nouvelArticle;
@FXML
private ToggleButton tool_liste_articles;
@FXML
private ToggleButton tool_liste_produits;
@FXML
private ToggleButton tool_achat;
@FXML
private ToggleButton tool_vente;
@FXML
private ToggleButton tool_bonDeCommande;
@FXML
private ToggleButton tool_credit;
@FXML
private ToggleButton tool_debit;
@FXML
private ToggleButton tool_liste_utilisateur;
@FXML
private ToggleButton tool_ajouter_utilisateur;
@FXML
private ToggleButton tool_calculatrice;
@FXML
private ToggleButton tool_aide;
@FXML
private ToggleButton tool_abonnement;

private final ArrayList<AnchorPane> contenuOnglets=new ArrayList<AnchorPane>(); 
@FXML
private ToggleGroup groupe_calc;
@FXML
private ToggleGroup groupe_aide;

@FXML
private ToggleGroup groupe_abonnement;

@FXML
private TabPane barreOnglets;
@FXML
private MenuItem solde;
@FXML
private MenuItem calculatrice;
@FXML
private MenuItem abonnement;

@Override
public void initialize(URL url, ResourceBundle rb) {
     initTab();
}

@FXML
private void initTab(){
    //La méthode sert à introduire le contenu des onglets dans une arraylist
    /*for(Menu menu: barre_menu.getMenus()){
        for(MenuItem mi: menu.getItems()){
            if(!(mi.getId().equals("Charger") ||mi.getId().equals("Enregistrer")
                    ||mi.getId().equals("Quitter") || mi.getId().equals("Solde")
                    || mi.getId().equals("Abonnement") || mi.getId().equals("Calculatrice")
                    || mi.getId().equals("Aide") || mi.getId().equals("A propos de nous"))){
               // AnchorPane ap= new AnchorPane();
                //ap.setId(mi.getId());
                //contenuOnglets.add(ap);
            }
        }
    }*/
    AnchorPane ap=new AnchorPane(),ap2=new AnchorPane();
    ap.setId("Accueil");
    ap2.setId("Créer un bon de commande");
    contenuOnglets.add(ap);
    contenuOnglets.add(ap2);

    //Ne pas oublier les tools bon de commande et accueil
    //Cet algo est utilisé de maniere temporaire
    //Par la suite on créera les fxml des anchorpane correspondants
    //en leur donnant les id correspondants
}

private void choisirOnglet(String id){
    for(AnchorPane anchorPane: contenuOnglets){
        if(anchorPane.getId().equals(id)){
            Tab tab= new Tab(id);
            int valeur=0;
            for(Tab t: barreOnglets.getTabs()){
                if(t.getText().equals(id)){
                    valeur=1;
                    barreOnglets.getSelectionModel().select(t);
                    break;
                }
            }
            if(valeur==0){
                tab.setContent(anchorPane);
                barreOnglets.getTabs().add(tab);
                barreOnglets.getSelectionModel().select(tab);
            }
            break;
        }
    }    
}

@FXML
private void ouvrir(Event event) {
    System.out.println("Fonction ouvrir");
    //This is the line that generates the error
    String id=((Node)event.getSource()).getId();
    choisirOnglet(id);

}

谢谢你的帮助

问题暂未有回复.您可以查看右边的相关问题.
1 JavaFX,SceneBuilder,MenuItem->图片

我最近找到了google-material-icons,现在我想使用图标使我的应用程序看起来更美观。 现在,我想将图像添加到应用程序中关闭MenuItem。 使用SceneBuilder,您可以仅添加项目,但是我现在想做的至少还是使用fxml。 我有两个问题: 我可以编辑fxml ...

5 JavaFX-不能在MenuItem中使用下划线

遇到一个非常奇怪的问题时,我正在用JavaFX创建一个程序。 我想用包含下划线(_)的文本创建一个MenuItem,但是当显示该文本时,下划线消失了。 这是示例代码: 它不显示“ Test_underscore”,而是显示以下内容: 有人知道这里会发生什么吗? ...

6 JavaFX MenuItem,处理事件

我正在开发一个小应用程序,但在创建菜单栏时遇到了问题。 这是我的启动方法: 我的问题是在这部分代码中: 我试图从 ArrayList 创建子菜单的项目。 该数据是从数据库中获取的,数据以 ArrayList 的形式返回。 除了 pairNameMenu.getItems().add(new ...

8 JavaFX SceneBuilder无法启动

我刚刚从Gluon安装了SceneBuilder,但无法启动...它安装正确(我注意到安装程序尚未结束。...但是所有文件都在AppData / Local中正确存在)我试图启动EXE但是它什么也不会做。 它不显示任何错误或任何内容,它不会启动。 ...

9 移动鼠标无法取消JavaFX MenuItem

如果按住鼠标单击其中一个MenuItems,然后将鼠标拖开,该按钮将保持选中状态。 即使将鼠标拖动到“ New或“ Save ,“ Open按钮仍将保持选中状态。 如果在Open之外的任何位置释放鼠标,该命令仍将执行 。 换句话说,当你按住鼠标的那一刻,即将调用Open的onAction ...

10 在 Javafx、scenebuilder 中移动 ImageView 时出现 NullPointerException

我知道之前在 Stackoverflow 上也有人问过类似的问题,但我找到的答案似乎都没有解决我的问题。 另外,我想补充一点,我对 javafx 完全陌生,并且一周前就开始编写 java 代码,所以我为我的代码中的任何愚蠢错误道歉! 当试图在我的 javafx 中移动一个 ImageView,在游戏 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM