2017-04-15 2 views
1

계산기 앱이 있습니다. app.class - main.java에서 controller.class - controller.java를 사용하여 두 개의 fxml - simplecalc.fxml 및 engineercalc.fxml을 조작 할 수 있습니다. Menubar 자체는 app.class로 코딩되어 있습니다. Simplecalc.fxml에서 Label의 데이터를 MenuBar의 복사 버튼을 사용하여 클립 보드로 복사했지만 다른 fxml - engineercalc에서 데이터를 복사하지 못했습니다. 그 라벨을 조작하기 위해 app.class의 컨트롤러를 사용하고 있습니다. 같은 fxml에서 어떻게 복사합니까?JavaFX 두 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 :

012,356

controller.java :

@FXML 
Label display; 

그것은 단지 simplecalc 작동 :

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

내가 engineercalc 함께 할 시도 :

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

그것은 호출 Exception in thread "JavaFX Application Thread" java.lang.NullPointerException

+0

당신은 – Sedrick

+0

당신이, 내 경우에는 약간의 예를 가져다 주시겠습니까 당신의 메뉴 아이템에 이벤트 핸들러를 필요로 당겨? – L1oN

+0

왜 Clipboad 핸들러를 Platform.runLater에 넣었습니까? – Sedrick

답변

0

예 :

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

나는 이것을 나중에 시도 할 것이다, 도움을 주셔서 감사합니다 – L1oN

+0

그건 그렇고,이 방법은 라벨 (디스플레이)에 클립 보드를 첨부 것입니까? – L1oN

+0

label.getText() 할 필요가 ... 여기에 넣어. – Sedrick

0

문제를 해결하는 한 가지 방법은 전역 부울 isStandardShowing을 만드는 것입니다. fxml이 시작시 표시되는 표준입니다. 표준 이벤트 핸들러에서 부울을 true로 설정합니다. Engineering 이벤트 핸들러에서 boolean을 false로 설정하십시오. 그런 다음 사용 if 문 경우 올바른 표시

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

선생님, 저를 도와 주셔서 대단한 일을하셨습니다. 귀하의지도는 내 앱의 약 50 %를 쓸 수있게 도와주었습니다. 나는 너의 도움에 대해 대단히 감사한다.그리고 결과 - 모든 코드가 완벽하게 작동합니다. 코드가 목발로 채워지더라도 원했던 것처럼) – L1oN

+0

기꺼이 도와 드리겠습니다. 코딩의 나머지 부분과 함께 행운을 빈다. – Sedrick

관련 문제