2017-04-15 5 views
1

J'ai une application calculatrice, elle fonctionne par app.class - main.java en utilisant controller.class - controller.java qui me permet de manipuler deux fxmls - simplecalc.fxml et engineercalc.fxml. Menubar elle-même codée dans app.class. J'ai réussi à utiliser le bouton Copier de MenuBar pour copier (dans le Presse-papiers) les données de Label dans simplecalc.fxml, mais je n'ai pas réussi à le faire dans un autre fxml - engineercalc. J'utilise des contrôleurs dans app.class pour manipuler ces étiquettes. Comment puis-je copier à partir de deux fxmls en même temps?JavaFX Manipuler des étiquettes à partir de deux FXML

Calculator visualisation

Switching between fxmls

main.java:

import java.io.IOException; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.stage.Stage; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuItem; 
import javafx.scene.control.SeparatorMenuItem; 
import javafx.scene.control.MenuBar; 
import javafx.scene.input.Clipboard; 
import javafx.scene.input.ClipboardContent; 
import javafx.scene.input.KeyCombination; 
import javafx.fxml.FXMLLoader; 

public class Calcmain extends Application { 

    public void start(Stage myStage) throws Exception{ 
     myStage.setTitle("Calculator"); 
     BorderPane rootNode = new BorderPane(); 
     Scene myScene = new Scene(rootNode, 235, 300); 
     myStage.setScene(myScene); 
     myStage.show(); 

     MenuBar mb = new MenuBar(); 
     Menu fileMenu = new Menu("_File"); 
     Menu editMenu = new Menu("_Edit"); 
     Menu viewMenu = new Menu("_View"); 
     Menu helpMenu = new Menu("_Help"); 


     fileMenu.setMnemonicParsing(true); 
     editMenu.setMnemonicParsing(true); 
     viewMenu.setMnemonicParsing(true); 
     helpMenu.setMnemonicParsing(true); 

     MenuItem openMenu = new MenuItem("Open"); 
     MenuItem exitMenu = new MenuItem("Exit"); 
     MenuItem copyMenu = new MenuItem("Copy"); 
     MenuItem pasteMenu = new MenuItem("Paste"); 
     MenuItem cutMenu = new MenuItem("Cut"); 
     MenuItem simpleMenu = new MenuItem("Standard"); 
     MenuItem engineerMenu = new MenuItem("Engineer"); 
     MenuItem aboutMenu = new MenuItem("About"); 

     openMenu.setAccelerator(KeyCombination.keyCombination(
"shortcut + O")); 
     exitMenu.setAccelerator(KeyCombination.keyCombination(
"shortcut + E")); 
     copyMenu.setAccelerator(KeyCombination.keyCombination(
"shortcut + C")); 
     pasteMenu.setAccelerator(KeyCombination.keyCombination(
"shortcut + V")); 
     cutMenu.setAccelerator(KeyCombination.keyCombination(
"shortcut + X")); 
     simpleMenu.setAccelerator(KeyCombination.keyCombination(
"shortcut + 1")); 
     engineerMenu.setAccelerator(KeyCombination.keyCombination(
"shortcut + 2")); 
     aboutMenu.setAccelerator(KeyCombination.keyCombination(
"shortcut + A")); 

     fileMenu.getItems().addAll(openMenu, new SeparatorMenuItem(), exitMenu); 
     editMenu.getItems().addAll(copyMenu, pasteMenu, cutMenu); 
     viewMenu.getItems().addAll(simpleMenu, new SeparatorMenuItem(), engineerMenu); 
     helpMenu.getItems().addAll(aboutMenu); 

     exitMenu.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent t) { 
       Platform.exit(); 
       System.exit(0); 
      } 
     }); 

     simpleMenu.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent t) { 
       Parent root; 
       try { 
        root = FXMLLoader.load(getClass().getResource("Simplecalc.fxml")); 
        rootNode.setCenter(root); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

     FXMLLoader loader = new FXMLLoader(this.getClass().getResource("Simplecalc.fxml")); 
     Parent root = loader.load(); 
     Controller controller = loader.getController(); 

     FXMLLoader loader2 = new FXMLLoader(this.getClass().getResource("Engineercalc.fxml")); 
     Controller controller2 = loader2.getController(); 

     engineerMenu.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent t) { 
       try { 
        Parent root2 = loader2.load(); 
        rootNode.setCenter(root2); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 
     mb.getMenus().add(fileMenu); 
     mb.getMenus().add(editMenu); 
     mb.getMenus().add(viewMenu); 
     mb.getMenus().add(helpMenu); 
     rootNode.setTop(mb); 

     rootNode.setCenter(root); 

     Clipboard clipboard = Clipboard.getSystemClipboard(); 
      Platform.runLater(new Runnable() { 
       @Override public void run() { 
        copyMenu.setOnAction(new EventHandler<ActionEvent>() { 
         public void handle(ActionEvent t) {  
         ClipboardContent content = new ClipboardContent(); 
         content.putString(controller.display.getText()); 
         clipboard.setContent(content); 
         } 
        }); 
       } 
      });  
} 

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

simplecalc.fxml:

<Label fx:id="display" alignment="CENTER_RIGHT" layoutY="2.0" prefHeight="98.0" prefWidth="235.0" AnchorPane.bottomAnchor="175.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="2.0"> 

engineercalc.fxml:

<Label fx:id="display" alignment="CENTER_RIGHT" layoutY="2.0" prefHeight="98.0" prefWidth="235.0" AnchorPane.bottomAnchor="175.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="2.0"> 

controller.java:

@FXML 
Label display; 

Il ne fonctionne qu'avec SimpleCalc:

ClipboardContent content = new ClipboardContent(); 
content.putString(controller.display.getText()); 
clipboard.setContent(content); 

Quand j'essaie le faire avec engineercalc:

ClipboardContent content = new ClipboardContent(); 
content.putString(controller2.display.getText()); 
clipboard.setContent(content); 

Il appelle: Exception in thread "JavaFX Application Thread" java.lang.NullPointerException

+0

Vous avez besoin des gestionnaires d'événements sur votre menuItems – Sedrick

+0

Pouvez-vous, s'il vous plaît, apportez un petit exemple dans mon cas? – L1oN

+0

Pourquoi avez-vous placé le gestionnaire de clipboad dans Platform.runLater? – Sedrick

Répondre

0

Exemple:

final Clipboard clipboard = Clipboard.getSystemClipboard(); 

copyMenu .setOnAction(new EventHandler<ActionEvent>() { 
    public void handle(ActionEvent t) {    
     final ClipboardContent content = new ClipboardContent(); 
     content.putString("get test from textfield and put it here"); 
     clipboard.setContent(content); 

    } 
}); 
+0

Je vais essayer cela plus tard, merci de votre aide – L1oN

+0

Par ailleurs, cette méthode va attacher le presse-papiers à l'étiquette (affichage)? – L1oN

+0

Vous devez faire label.getText() s'il était dit ... Mettez-le ici. – Sedrick

0

Une façon de résoudre votre problème consiste à créer un booléen global isStandardShowing. Set is to true est le fxml standard affiché au démarrage. Dans le gestionnaire d'événements standard, définissez le booléen sur true. Dans le gestionnaire d'événements Engineering, définissez le booléen sur false. Ensuite, utilisez une instruction if pour tirer de l'affichage correct

boolean isStandardShow = true;//This should be global. 

    Clipboard clipboard = Clipboard.getSystemClipboard(); 
     Platform.runLater(new Runnable() { 
      @Override public void run() { 
       copyMenu.setOnAction(new EventHandler<ActionEvent>() { 
        public void handle(ActionEvent t) {  
        ClipboardContent content = new ClipboardContent(); 
        if(isStandardShow) 
        { 
         content.putString(controller.display.getText()); 
        } 
        else 
        {        
         content.putString(OtherContorller.display.getText()); 
        } 
        clipboard.setContent(content); 
        } 
       }); 
      } 
     }); 
+0

Monsieur, vous avez fait du bon travail pour m'aider. Vos conseils m'ont aidé à écrire environ 50% de mon application. Je suis très reconnaissant pour votre aide.Et pour le résultat - tout fonctionne parfaitement, comme je le voulais, bien que le code soit rempli de béquilles) – L1oN

+0

Je suis content d'avoir pu aider. Bonne chance avec le reste de votre code. – Sedrick