Доброе утро, я работаю над проектом, но у меня есть проблема.Фактически я создал 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);
}
Спасибо за вашу помощь