JavaFX

2013-12-15 20 views
6

में मेनूइटम से दृश्य प्राप्त करने में असमर्थ I मेनू क्लिक के आधार पर एक javafx चरण में दृश्य को बदलने की कोशिश कर रहा हूं।JavaFX

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.net.*?> 
<?import javafx.geometry.Insets?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.image.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.layout.GridPane?> 

<AnchorPane prefHeight="-1.0" prefWidth="560.0" styleClass="background" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="sample.Controller"> 
    <children> 
    <MenuBar layoutY="0.0" maxWidth="1.7976931348623157E308" prefWidth="300.0" useSystemMenuBar="false" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="2.0"> 
     <menus> 
     <Menu id="manageAccountsMenu" mnemonicParsing="false" onAction="#onManageAccountsMenuActionPerformed" text="Accounts" fx:id="manageAccountsMenu"> 
      <items> 
      <MenuItem mnemonicParsing="false" onAction="#onTweetsMenuActionPerformed" text="Manage" fx:id="manageAccountsSubmenuItem" /> 
      </items> 
     </Menu> 
     <Menu mnemonicParsing="false" onAction="#onTweetsMenuActionPerformed" text="Tweets" fx:id="tweetsMenuItem" /> 
     <Menu mnemonicParsing="false" text="Retweets" /> 
     </menus> 
    </MenuBar> 
    <VBox id="VBox" alignment="CENTER" layoutY="24.0" spacing="5.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"> 
     <children> 
     <ScrollPane id="ScrollPane" fitToHeight="true" fitToWidth="true" prefViewportHeight="400.0" prefViewportWidth="300.0"> 
      <content> 
      <TableView prefHeight="-1.0" prefWidth="-1.0" tableMenuButtonVisible="true"> 
       <columns> 
       <TableColumn editable="false" prefWidth="75.0" text="SNO" /> 
       <TableColumn prefWidth="200.0" text="Account" /> 
       <TableColumn prefWidth="200.0" text="Status" /> 
       <TableColumn prefWidth="75.0" text="Actions" /> 
       </columns> 
      </TableView> 
      </content> 
     </ScrollPane> 
     <Button mnemonicParsing="false" text="Add Account" textAlignment="CENTER"> 
      <graphic> 
      <ImageView fitHeight="150.0" fitWidth="200.0" mouseTransparent="true" pickOnBounds="true" preserveRatio="true"> 
       <image> 
       <Image url="@addAccount.png" /> 
       </image> 
      </ImageView> 
      </graphic> 
     </Button> 
     </children> 
    </VBox> 
    </children> 
    <stylesheets> 
    <URL value="@darkTheme.css" /> 
    </stylesheets> 
</AnchorPane> 

यहाँ मेरी Controller.java है: यहाँ मेरी sample.fxml है

package sample; 

import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.Node; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.MenuItem; 
import javafx.stage.Stage; 

import java.net.URL; 
import java.util.ResourceBundle; 

public class Controller implements Initializable { 
    @FXML 
    protected void onManageAccountsMenuActionPerformed(ActionEvent event) { 
     System.out.println("Manage Accbtnclick"); 
//  Node node=(Node) event.getSource(); 
//  Stage stage=(Stage) node.getScene().getWindow(); 
// 
//  Scene scene = new Scene(root); 
//  stage.setScene(scene); 
//  stage.show(); 
    } 
    @FXML 
    protected void onTweetsMenuActionPerformed(ActionEvent event) { 
     System.out.println("Manage Accbtnclick"); 
    Node node= (Node)event.getSource(); 
    Stage stage=(Stage) node.getScene().getWindow(); 
    Scene scene = Main.screens.get("tweet"); 
    stage.setScene(scene); 
    stage.show(); 
    } 

    @Override 
    public void initialize(URL url, ResourceBundle resourceBundle) { 
     //To change body of implemented methods use File | Settings | File Templates. 
    } 
} 

यहाँ मेरी Main.java है:

package sample; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.geometry.Pos; 
import javafx.scene.Group; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.ProgressBar; 
import javafx.scene.control.ProgressIndicator; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

import java.io.IOException; 
import java.util.HashMap; 

public class Main extends Application { 

    public static HashMap<String,Scene> screens=new HashMap<String,Scene>(); 

    @Override 
    public void start(Stage stage) { 
     try { 
      Parent accountScreen= FXMLLoader.load(getClass().getResource("sample.fxml")); 
      Parent tweetScreen=FXMLLoader.load(getClass().getResource("tweetform.fxml")); 
      //Parent retweetScreen=FXMLLoader.load(getClass().getResource("retweetform.fxml")); 
      screens.put("account",new Scene(accountScreen)); 
      screens.put("tweet",new Scene(tweetScreen)); 
      //screens.put("retweet",new Scene(retweetScreen)); 
      stage.setTitle("Manage Accounts"); 
      stage.setScene(screens.get("account")); 
      stage.show(); 
     } catch (IOException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } 

    } 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 

जब मैं MENUITEM पर क्लिक करें के तहत प्रबंधित लेखा मेनू, मुझे निम्न अपवाद मिलता है:

"C:\Program Files\Java\jdk1.7.0_17\bin\java" -Didea.launcher.port=7541 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 12.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_17\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\rt.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_17\jre\lib\ext\zipfs.jar;C:\Users\rahulserver\IdeaProjects\DrawingText\out\production\DrawingText;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 12.1.4\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain sample.Main 
Manage Accbtnclick 
Manage Accbtnclick 
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1440) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:28) 
    at javafx.event.Event.fireEvent(Event.java:171) 
    at javafx.scene.control.MenuItem.fire(MenuItem.java:456) 
    at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1188) 
    at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$6.handle(ContextMenuContent.java:1139) 
    at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer$6.handle(ContextMenuContent.java:1137) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33) 
    at javafx.event.Event.fireEvent(Event.java:171) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3328) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3168) 
    at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3123) 
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1563) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2265) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:250) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:173) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:292) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:528) 
    at com.sun.glass.ui.View.notifyMouse(View.java:922) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29) 
    at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:55) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:269) 
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1435) 
    ... 40 more 
Caused by: java.lang.ClassCastException: javafx.scene.control.MenuItem cannot be cast to javafx.scene.Node 
    at sample.Controller.onTweetsMenuActionPerformed(Controller.java:29) 
    ... 50 more 

तो मैं मेनू से युक्त चरण/दृश्य कैसे प्राप्त करूं आइटम आइटम ईवेंट हैंडलर पर क्लिक करें?

संपादित लाइन

Node node= (Node)event.getSource(); 
controller.java में

लाइन नंबर 29 जो समस्याओं दे रहा है है।

+0

* 'java.lang.NullPointer नमूना नमूना पर। नियंत्रक.ऑन ट्वीट्समेनूएक्शनप्रोर्फ़ॉर्म (Controller.java:30)' * => आपके नियंत्रक.जावा वर्ग की लाइन 30 कहां है? – assylias

+0

@assylias चरण चरण = (चरण) node.getScene()। GetWindow(); – rahulserver

+0

मेरा अनुमान है कि 'नोड' दिखाई नहीं दे रहा है इसलिए खिड़की नहीं है। आप उस बिंदु पर चर को जांचने के लिए कोड डीबग करने का प्रयास कर सकते हैं। – assylias

उत्तर

12

आपका वास्तविक त्रुटि स्टैक ट्रेस की अंतिम पंक्ति के बाद दूसरे स्थान में दिखाया गया है:

Caused by: java.lang.ClassCastException: javafx.scene.control.MenuItem cannot be cast to javafx.scene.Node 
    at sample.Controller.onTweetsMenuActionPerformed(Controller.java:29) 

यह त्रुटि आपके नियंत्रक से निम्न पंक्ति की चर्चा करते हुए किया जाता है:

Node node= (Node)event.getSource(); 

JavaFX को देखते हुए एपीआई डॉक्स, न तो मेनूइटम और न ही मेनू नोड के उप-वर्ग हैं। http://docs.oracle.com/javafx/2/api/javafx/scene/control/MenuItem.html http://docs.oracle.com/javafx/2/api/javafx/scene/control/Menu.html

मैं एक वस्तु के रूप में स्रोत हथियाने, तो आगे बढ़ने से पहले अपने प्रकार की जाँच का सुझाव देते हैं। इसके अलावा, मैं getSource() विधि का उपयोग कर समस्याओं में भाग गया; GetTarget() विधि मेरे लिए बेहतर काम करती है। किसी भी तरह से, आपको अभी भी चरण में जाने के लिए एक रास्ता चाहिए।

ऐसा करने के लिए, आप id टैग के बजाय अपने FXML में fx:id टैग का उपयोग करना चाहेंगे। यह आपको सीधे अपने नियंत्रक में FXML तत्वों को इंजेक्ट करने की अनुमति देगा। उदाहरण के लिए, आप मेनूबार तत्व से अपने नियंत्रक में इंजेक्शन करके मेनूबार (जो नोड का उप-वर्ग है) से चरण को पकड़ सकते हैं।

FXML में:

<MenuBar fx:id="myMenuBar" layoutY="0.0" maxWidth="1.7976931348623157E308" prefWidth="300.0" useSystemMenuBar="false" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="2.0"> 

नियंत्रक में:

public class Controller implements Initializable { 
    @FXML MenuBar myMenuBar; 
    ... 
    @FXML 
    protected void onTweetsMenuActionPerformed(ActionEvent event) { 
     System.out.println("Manage Accbtnclick"); 
     Stage stage = (Stage) myMenuBar.getScene().getWindow(); 
     Scene scene = Main.screens.get("tweet"); 
     stage.setScene(scene); 
     stage.show(); 
    } 
    ... 
} 

आप यहाँ सुधार करने का एक सा क्या करने की जरूरत सकता है, लेकिन उम्मीद है कि यह मदद करता है।

+0

बहुत अच्छा लगता है। आपके लिए +10 लेकिन कोशिश करने के बाद जवाब के रूप में इसे पुष्टि करें। – rahulserver

-1

Scene और Window प्राप्त करने का एक तरीका यहां मेनू आइटम के आधार पर इंजेक्शन किए गए FXML तत्व के बिना क्लिक किया जा रहा है, या इसे संदर्भित किए बिना यदि आपने इसे FXML के साथ बनाया है। Event के लक्ष्य का उपयोग करके दूसरे शब्दों में।

मेरी समस्या में मैं (के रूप में मुझे पता चला है, जो मैं के रूप में मैं FXML में मेरे मेनू बनाया था नहीं पता था कि एक ContextMenu) MenuItems युक्त एक लटकती मेनू के साथ एक MenuButton थी और मैं जो की जरूरत है एक FileChooser खोलने के लिए चाहता था, Window एक तर्क के रूप में, जब "सहेजें" MenuItem क्लिक किया गया था।

आम तौर पर मैं घटना के लक्ष्य, फिर अभिभावक, फिर अगला अभिभावक आदि प्राप्त करने के मार्ग से नीचे चला गया होता और अंततः दृश्य और फिर विंडो। Menu और MenuItem रूप Node रों नहीं हैं और इसलिए Parent रों इस मामले में हालांकि मैं निम्नलिखित किया था की जरूरत नहीं है:

FileChooser fileChooser = new FileChooser(); 

MenuItem menuItem = (MenuItem)event.getTarget(); 
ContextMenu cm = menuItem.getParentPopup(); 
Scene scene = cm.getScene(); 
Window window = scene.getWindow(); 

fileChooser.showSaveDialog(window); 

या, एक एक पंक्ति बहस में थोक परिवर्तित:

FileChooser fileChooser = new FileChooser(); 

fileChooser.showSaveDialog(((MenuItem)event.getTarget()).getParentPopup().getScene().getWindow()); 

बस इसे अपने स्वयं के दृश्य-ग्राफ (यानी उप-मेनू आदि के मामलों में कितने माता-पिता को प्राप्त करने की आवश्यकता है) के आधार पर इसे अनुकूलित करें और Window होने के बाद आप क्या करना चाहते हैं, लेकिन एक बार जब आप ContextMenu (MenuItems की पॉपअप सूची), आप Scene प्राप्त कर सकते हैं और उसके बाद से Window प्राप्त कर सकते हैं।




एक अलग रूप में के रूप में, यहाँ FXML मैं अपने MenuButton बनाने के लिए प्रयोग किया जाता है, और इसलिए मैं क्यों मैं कुछ परीक्षण के बिना getParentPopup() के लिए एक कॉल के माध्यम से ContextMenu पाने के लिए था एहसास नहीं था । और त्रुटि:

<MenuButton fx:id="menu" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" mnemonicParsing="false" prefHeight="34.0" prefWidth="35.0" style="-fx-background-color: #6600ff; -fx-border-width: 0; -fx-mark-color: white; -fx-padding: 5;" textAlignment="CENTER" textFill="WHITE" underline="true"> 
    <items> 
     <MenuItem fx:id="newSearch" mnemonicParsing="false" text="New Search" onAction="#clearSearch" /> 
     <SeparatorMenuItem /> 
     <MenuItem fx:id="saveSearch" mnemonicParsing="false" text="Save Search" onAction="#saveSearch" /> 
     <MenuItem fx:id="loadSearch" mnemonicParsing="false" text="Load Search" /> 
     <SeparatorMenuItem /> 
     <MenuItem fx:id="saveResults" mnemonicParsing="false" text="Save Results" /> 
     <MenuItem fx:id="loadResults" mnemonicParsing="false" text="Load Results" /> 
     <SeparatorMenuItem /> 
     <MenuItem fx:id="exportResults" mnemonicParsing="false" text="Export Results" /> 
    </items> 
    <font> 
     <Font name="Arial" size="12.0" /> 
    </font> 
</MenuButton> 
0

स्टेज चरण = (चरण) ((नोड) myMenuBar) .getScene() GetWindow();

+2

कृपया अपने उत्तर में एक स्पष्टीकरण जोड़ें –