JavaFX 操作两个 FXML 中的标签

标签 java javafx label clipboard

我有一个计算器应用程序,它由app.class - main.java 使用controller.class -controller.java 运行,它允许我操作两个fxml - simplecalc.fxml 和engineercalc.fxml。菜单栏本身在 app.class 中编码。 我设法使用菜单栏中的复制按钮从 simplecalc.fxml 中的标签复制(到剪贴板)数据,但我在另一个 fxml - Engineercalc 中未能这样做。我在 app.class 中使用 Controller 来操作这些标签。如何同时从两个 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;

它仅适用于 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);

它调用:线程“JavaFX应用程序线程”java.lang.NullPointerException中的异常

最佳答案

示例:

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);

    }
});

关于JavaFX 操作两个 FXML 中的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43420880/

相关文章:

ios - Cocos2d JS混合字体标签

java - 使用 UUID 作为 Hibernate 主键 id 是否被认为是糟糕的设计?

java - Jasper 报告 - 无法归档文件 : null

java - 解释一下Java中的多态性?

java - 如何将 CSS 文件设置为整个应用程序 JavaFX

java - 无法从 Java 主应用程序运行两个 Java FX 实例?

css - IE7 问题中的长标签单选按钮

java - 从 jsonschema2pojo 生成不应该存在的类生成的 POJO

javafx - 如何将列表的大小属性绑定(bind)到节点的禁用属性?

Java - 字符中的重复大小写标签