JavaFX и SceneBuilder - не могут получить источник события, когда это MenuItem - PullRequest
0 голосов
/ 14 ноября 2018

Доброе утро, я работаю над проектом, но у меня есть проблема.Фактически я создал MenuItems и Buttons с помощью SceneBuilder и добавил метод «ouvrir», который должен активироваться, когда мы нажимаем на кнопки или menuItems.На самом деле я беру идентификатор источника события, чтобы открыть вкладку.Этот метод работает для кнопок, но не для 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);

}

Спасибо за вашу помощь

...