JavaFX正确使用阶段和阶段控制器(糟糕的开始)

时间:2016-04-15 20:32:26

标签: java model-view-controller javafx scene

过去几天我一直在研究这个问题并尝试找到一些不同的解决方案,但我仍然很难正确地实施它们。

我有一个项目必然会变成中等大小的东西所以我想确保我从一开始就正确使用MVC,而不是仅仅将它分开“让它工作”。

截至目前,该应用程序仅打开3个场景,2个开始(不需要fxml),另一个用于设置(使用FXML)。我确实需要注意对这些应用程序的强引用,因为此应用程序将在低资源设备上运行。

最终我的问题是: 我正确使用场景和控制器吗?并且给定了我启动设置场景的方式我没有找到用控制器编辑它的方法。我做错了什么?

以下是我到目前为止的情况,我必须说我不喜欢我从Main初始化前2个场景的方式,当然尝试启动设置场景是相当偶然的。我现在的障碍是试图通过他们的控制器与场景互动。

Main.java

package sample;
import javafx.application.Application;
import javafx.stage.Stage;
import sample.controllers.StageController;

<pre>
public class Main extends Application
{
    @Override
    public void start(Stage primaryStage) throws Exception
    {
        StageController newStage = new StageController();
        newStage.start(primaryStage);
    }

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

}

StageController.java

package sample.controllers;

import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import java.util.List;

import static sample.controllers.HotkeyController.createHotkeys;
import static sample.controllers.WebViewController.createWebView;

/**
 * Created by devin on 4/14/16.
 */
public class StageController extends Application
{
    @Override
    public void start(Stage primaryStage)throws Exception
    {
        Screen primaryScreen = Screen.getPrimary();
        Screen secondaryScreen;
        List<Screen> allScreens = Screen.getScreens();
        if (allScreens.size() <= 1)
        {
            System.out.println("Only one screen");
            secondaryScreen = primaryScreen;
        }
        else
        {
            if (allScreens.get(0).equals(primaryScreen))
            {
                secondaryScreen = allScreens.get(1);
            }
            else
            {
                secondaryScreen = allScreens.get(0);
            }
        }
        configureStage("Primary", primaryStage, primaryScreen);
        final Stage secondaryStage = new Stage();
        configureStage("Secondary", secondaryStage, secondaryScreen);
    }
    private void configureStage(final String name, final Stage stage, final Screen screen)
    {
        Rectangle2D bounds = screen.getBounds();
        System.out.println(name + ":" + bounds);

        stage.setX(bounds.getMinX());
        stage.setY(bounds.getMinY());
        stage.setWidth(bounds.getWidth());
        stage.setHeight(bounds.getHeight());

        stage.initStyle(StageStyle.UNDECORATED);

        showStage(name, stage, screen);

        stage.show();
        stage.setFullScreen(true);
    }

    private void showStage(final String name, final Stage stage, final Screen screen)
    {
        //Scene scene = new Scene(new Group());

        StackPane root = new StackPane();
        Scene scene = new Scene(root);
        stage.setScene(scene);

        createWebView(name, root);
        scene.setRoot(root);

        /*
         * Use hotkeys to allow application actions
         */
        createHotkeys(name, scene);
    }

}

WebViewController

package sample.controllers;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import org.w3c.dom.Document;

/**
 * Created by devin on 4/13/16.
 */
public class WebViewController
{

    public static void createWebView(final String name, final StackPane root)
    {
        final WebView browser = new WebView();
        final WebEngine webEngine = browser.getEngine();
        if (name == "Primary") {
            webEngine.load("http://google.com");
        }
        else
        {
            webEngine.load("http://google.com");
        }

        webEngine.documentProperty().addListener(new ChangeListener<Document>()
        {
            @Override public void changed(ObservableValue<? extends Document> prop, Document oldDoc, Document newDoc)
            {
                String heightText = browser.getEngine().executeScript(
                        "window.getComputedStyle(document.body, null).getPropertyValue('height')"
                ).toString();
                double height = Double.valueOf(heightText.replace("px", ""));

                System.out.println("Height of browser on " + name + " " + height);
            }
        });

        root.getChildren().addAll(browser);

        /* This is a firebug call if we need to debug the webpage that is being loaded */
//        webEngine.documentProperty().addListener(new ChangeListener<Document>() {
//            @Override public void changed(ObservableValue<? extends Document> prop, Document oldDoc, Document newDoc) {
//                enableFirebug(webEngine);
//            }
//        });
    }

    private static void enableFirebug(final WebEngine engine) {
        engine.executeScript("if (!document.getElementById('FirebugLite')){E = document['createElement' + 'NS'] && document.documentElement.namespaceURI;E = E ? document['createElement' + 'NS'](E, 'script') : document['createElement']('script');E['setAttribute']('id', 'FirebugLite');E['setAttribute']('src', 'https://getfirebug.com/' + 'firebug-lite.js' + '#startOpened');E['setAttribute']('FirebugLite', '4');(document['getElementsByTagName']('head')[0] || document['getElementsByTagName']('body')[0]).appendChild(E);E = new Image;E['setAttribute']('src', 'https://getfirebug.com/' + '#startOpened');}");
    }

}

HotkeyController.java

package sample.controllers;

import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
import javafx.scene.input.KeyCombination;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;

/**
 * Created by devin on 4/13/16.
 */

public class HotkeyController
{

    public static void createHotkeys(final String name, final Scene scene)
    {
        final KeyCombination exitCMD = new KeyCodeCombination(KeyCode.E, KeyCombination.CONTROL_DOWN);
        scene.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>()
        {
            @Override
            public void handle(KeyEvent event)
            {
                if (exitCMD.match(event))
                {
                    System.out.println("CTRL + E was pressed on " + name + " display\n" +
                            "Exiting the application");
                    Platform.exit();
                }
            }
        });

        final KeyCombination settingsCMD = new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN);
        scene.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>()
        {
            @Override
            public void handle(KeyEvent event)
            {
                if (settingsCMD.match(event))
                {
                    System.out.println("CTRL + S was pressed on " + name + " display\n" +
                            "Opening Settings Scene");
                    /*
                     *  This is where we need to launch a scene for settings
                     */
                    try
                    {
                        Parent root = FXMLLoader.load(getClass().getResource("/sample/view/settingsscreen.fxml"));
                        Stage settingsStage = new Stage();
                        settingsStage.setTitle("FTX Signage Settings");
                        settingsStage.setScene(new Scene(root, 500 , 400));
                        settingsStage.show();

//                        SettingsController settingsController = new SettingsController();
//                        GettersSetters getSet = new GettersSetters();
//                        settingsController.getText();
//                        String hostname = getSet.getHostname();
//                        settingsController.setText(hostname);

                    } catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

}

0 个答案:

没有答案