如何使用具有多个场景的JavaFX菜单项

时间:2016-07-09 19:53:29

标签: javafx javafx-8 fxml

我可能在想这个,这就是为什么它让我难过。我已经构建了一个包含多个场景的应用。每个都有用户填写的文本字段和复选框,然后他们将该信息输出为文本文件。我可以毫无问题地切换场景,我可以使用一个按钮来保存文件,该按钮调用每个控制器中基本相同的功能。我在根上有一个菜单栏,允许切换到不同的场景,加载默认值或以前的值,然后退出。我想在那里也有一个保存选项。我可以将Save_As指向将写入文件的控制器或模型,但我需要从当前场景中获取数据。我想我需要能够访问当前的控制器才能够做到这一点。

这是我的MainApp

package application;
import application.controller.MainController;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import java.io.IOException;

public class MainApp extends Application {

@Override
public void start(Stage stage) throws Exception{
    stage.setTitle("Volundr Options File Generator");
    stage.setScene(createScene(loadMainPane()));
    stage.show();
}

/**
 * Loads the main fxml layout.
 * Sets up the vista switching VistaNavigator.
 * Loads the first vista into the fxml layout.
 *
 * @return the loaded pane.
 * @throws IOException if the pane could not be loaded.
 */
private Pane loadMainPane() throws IOException {
    FXMLLoader loader = new FXMLLoader();

    Pane mainPane = loader.load(getClass().getResourceAsStream(VistaNavigator.MAIN));
    //Pane mainPane = (Pane) loader.load(getClass().getResourceAsStream(VistaNavigator.MAIN));

    MainController mainController = loader.getController();

    VistaNavigator.setMainController(mainController);
    VistaNavigator.loadVista(VistaNavigator.VISTA_0);

    return mainPane;
}

/**
 * Creates the main application scene.
 *
 * @param mainPane the main application layout.
 *
 * @return the created scene.
 */
private Scene createScene(Pane mainPane) {
    Scene scene = new Scene(mainPane);

 scene.getStylesheets().setAll(getClass().getResource("vista.css").toExternalForm());

    return scene;
}

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

MainController

package application.controller;
import application.VistaNavigator;
import application.models.OptionsFileDefaults;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.layout.StackPane;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Arrays;

public class MainController{

/** Holder of a switchable vista. */
@FXML public StackPane vistaHolder;
@FXML public PermutationAnalysisController permutationAnalysisController;

@FXML
public void programExit(){System.exit(0);}
public void singleCell(){VistaNavigator.loadVista(VistaNavigator.VISTA_1);}
public void segmentAnalyzer(){VistaNavigator.loadVista(VistaNavigator.VISTA_2);}
public void permutationAnalyzer(){VistaNavigator.loadVista(VistaNavigator.VISTA_3);}
public void syntheticLethal(){VistaNavigator.loadVista(VistaNavigator.VISTA_4);}
public void loadDefaultValues() throws IOException {OptionsFileDefaults.loadDefaultValue();}

@FXML
public void saveFile() {

    //doSomething(getClass().getMethod(generateOptionsFile));
}

/**
 * Replaces the vista displayed in the vista holder with a new vista.
 *
 * @param node the vista node to be swapped in.
 */
public void setVista(Node node) {
    vistaHolder.getChildren().setAll(node);
}
}

VistaNavigator

package application;
import application.controller.MainController;
import javafx.fxml.FXMLLoader;
import java.io.IOException;

public class VistaNavigator {

/**
 * Constants for fxml layouts managed by the navigator.
 */
static final String MAIN    = "views/main.fxml";
public static final String VISTA_0 = "views/entry_vista.fxml";
public static final String VISTA_1 = "views/single_cell_analysis.fxml"; // Single Cell
public static final String VISTA_2 = "views/segment_analysis.fxml";
public static final String VISTA_3 = "views/permutation_analysis.fxml";
public static final String VISTA_4 = "views/entry_vista.fxml"; // Synthetic lethal

/** The main application layout controller. */
private static MainController mainController;

/**
 * Stores the main controller for later use in navigation tasks.
 *
 * @param mainController the main application layout controller.
 */
static void setMainController(MainController mainController) {
    VistaNavigator.mainController = mainController;
}

/**
 * Loads the vista specified by the fxml file into the
 * vistaHolder pane of the main application layout.
 *
 * Previously loaded vista for the same fxml file are not cached.
 * The fxml is loaded anew and a new vista node hierarchy generated
 * every time this method is invoked.
 *
 * @param fxml the fxml file to be loaded.
 */
public static void loadVista(String fxml) {

    try {
        mainController.setVista(FXMLLoader.load(VistaNavigator.class.getResource(fxml)));
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我发布这个作为一个潜在的答案,但对我来说似乎很复杂。简而言之,我添加了一个类,它始终从每个场景控制器获取更新。从主Save_As我可以简单地调用文件编写器代码。我不接受这个作为最终答案,因为它似乎过于复杂而且有点慢。

置换控制器

package application.controller;
import application.models.*;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.css.PseudoClass;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import org.apache.commons.lang3.StringUtils;
import java.awt.*;
import java.io.*;
import java.util.Objects;

import static application.models.OptionsDataCollector.*;
import static application.models.OptionsDataCollector.targetPermFile;
import static application.models.OptionsFileDefaults.defaultValues;
import static application.models.ValidationForm.*;

/**
 * Controller class to handle displaying the GUI showing the options required for the permutation analysis.
 * PermutationAnalysisController.java
 *
 * @author Dennis A. Simpson
 * @version 0.5beta
 * @since July 9, 2016
 */

public class PermutationAnalysisController {

private Desktop desktop = Desktop.getDesktop();
@FXML private TextField segmentFile = new TextField();
@FXML private TextField cellName = new TextField();
@FXML private TextField targetGroupSize = new TextField();
@FXML private TextField libraryName = new TextField();
@FXML private TextField spawnJobs = new TextField();
@FXML private CheckBox excludeChrY = new CheckBox();
@FXML private CheckBox writeMapFile = new CheckBox();
@FXML private CheckBox segPermFile = new CheckBox();
@FXML private CheckBox targetPermFile = new CheckBox();
@FXML private TextField targetBedFile = new TextField();
@FXML private TextField freqIterations = new TextField();
@FXML private TextField repeatCount = new TextField();
@FXML private TextField bedGroup = new TextField();
@FXML private TextField progCheck = new TextField();
@FXML private Label targetGroupSizeLabel;
@FXML private Button loadValues;

private final PseudoClass errorClass = PseudoClass.getPseudoClass("error");
private final PseudoClass hiddenClass = PseudoClass.getPseudoClass("hidden");

@FXML public void initialize(){

    OptionsDataCollector.runModule = "--Permutation_Analysis";
    OptionsDataCollector.excludeChrY = excludeChrY;
    OptionsDataCollector.writeMapFile = writeMapFile;
    OptionsDataCollector.segPermFile = segPermFile;
    OptionsDataCollector.targetPermFile = targetPermFile;

    spawnJobs.pseudoClassStateChanged(errorClass, false);
    spawnJobs.setText("1");
    OptionsDataCollector.spawnJobs = spawnJobs.getText();

    segmentFile.pseudoClassStateChanged(errorClass, true);
    cellName.pseudoClassStateChanged(errorClass, true);
    libraryName.pseudoClassStateChanged(errorClass, true);

    progCheck.pseudoClassStateChanged(errorClass, false);
    progCheck.setText("20000");
    OptionsDataCollector.progCheck = progCheck.getText();

    targetBedFile.pseudoClassStateChanged(errorClass, true);
    freqIterations.pseudoClassStateChanged(errorClass, true);
    repeatCount.pseudoClassStateChanged(errorClass, true);
    bedGroup.pseudoClassStateChanged(errorClass, true);

    targetGroupSize.pseudoClassStateChanged(hiddenClass, true);
    targetGroupSize.pseudoClassStateChanged(errorClass, true);
    targetGroupSizeLabel.pseudoClassStateChanged(hiddenClass, true);

    targetBedFile.focusedProperty().addListener((observable, oldValue, newValue) ->{
        targetBedFile.pseudoClassStateChanged(errorClass, !pathValidate(targetBedFile.getText()));
        OptionsDataCollector.targetBedFile = targetBedFile.getText();
    });

    freqIterations.focusedProperty().addListener((observable, oldValue, newValue) -> {
        if(!Objects.equals(freqIterations.getText(), "0") && numberValidate(freqIterations.getText())){
            freqIterations.pseudoClassStateChanged(errorClass, false);
            OptionsDataCollector.freqIterations = freqIterations.getText();
        }else{
            freqIterations.pseudoClassStateChanged(errorClass, true);
            OptionsDataCollector.freqIterations = freqIterations.getText();
        }
    });

    repeatCount.focusedProperty().addListener((observable, oldValue, newValue) -> {
        if(!Objects.equals(repeatCount.getText(), "0") && numberValidate(repeatCount.getText())){
            repeatCount.pseudoClassStateChanged(errorClass, false);
            OptionsDataCollector.repeatCount = repeatCount.getText();
        }else{
            repeatCount.pseudoClassStateChanged(errorClass, true);
            OptionsDataCollector.repeatCount = repeatCount.getText();
        }
    });

    progCheck.focusedProperty().addListener((observable, oldValue, newValue) -> {
        if(numberValidate(progCheck.getText())){
            progCheck.pseudoClassStateChanged(errorClass, false);
            OptionsDataCollector.progCheck = progCheck.getText();
        }else{
            progCheck.pseudoClassStateChanged(errorClass, true);
            OptionsDataCollector.progCheck = progCheck.getText();
        }
    });

    spawnJobs.focusedProperty().addListener((observable, oldValue, newValue) -> {
        if(!Objects.equals(spawnJobs.getText(), "0") && numberValidate(spawnJobs.getText())){
            spawnJobs.pseudoClassStateChanged(errorClass, false);
            OptionsDataCollector.spawnJobs = spawnJobs.getText();
        }else{
            spawnJobs.pseudoClassStateChanged(errorClass, true);
            OptionsDataCollector.spawnJobs = spawnJobs.getText();
        }
    });

    bedGroup.focusedProperty().addListener((observable, oldValue, newValue) -> {
        if(!Objects.equals(bedGroup.getText(), "0") && numberValidate(bedGroup.getText())){
            bedGroup.pseudoClassStateChanged(errorClass, false);
            OptionsDataCollector.bedGroup = bedGroup.getText();
        }else{
            bedGroup.pseudoClassStateChanged(errorClass, true);
            OptionsDataCollector.bedGroup = bedGroup.getText();
        }
    });

    segmentFile.focusedProperty().addListener((observable, oldValue, newValue) -> {
        segmentFile.pseudoClassStateChanged(errorClass, !pathValidate(segmentFile.getText()));
        OptionsDataCollector.segmentFile = segmentFile.getText();
    });

    cellName.focusedProperty().addListener((observable, oldValue, newValue) -> {
        cellName.pseudoClassStateChanged(errorClass, !(!StringUtils.isBlank(cellName.getText()) &&
                textValidate(cellName.getText())));
        OptionsDataCollector.cellName = cellName.getText();
    });

    libraryName.focusedProperty().addListener((observable, oldValue, newValue) -> {
        if(!StringUtils.isBlank(libraryName.getText()) && textValidate(libraryName.getText())){
            libraryName.pseudoClassStateChanged(errorClass, false);
            OptionsDataCollector.libraryName = libraryName.getText();
        }else{
            libraryName.pseudoClassStateChanged(errorClass, true);
            OptionsDataCollector.libraryName = libraryName.getText();
        }
    });

    targetPermFile.focusedProperty().addListener(((observable, oldValue, newValue) -> {
        if(targetPermFile.isSelected()){
            targetGroupSize.pseudoClassStateChanged(hiddenClass, false);
            OptionsDataCollector.targetGroupSize = targetGroupSize.getText();
            targetGroupSizeLabel.pseudoClassStateChanged(hiddenClass, false);
        }
        else {if (!targetPermFile.isSelected()) {
            targetGroupSize.pseudoClassStateChanged(hiddenClass, true);
            OptionsDataCollector.targetGroupSize = targetGroupSize.getText();
            targetGroupSizeLabel.pseudoClassStateChanged(hiddenClass, true);
        }}
    }));

    targetGroupSize.focusedProperty().addListener((observable, oldValue, newValue) -> {
        if(!Objects.equals(targetGroupSize.getText(), "0") && numberValidate(targetGroupSize.getText())){
            targetGroupSize.pseudoClassStateChanged(errorClass, false);
            OptionsDataCollector.targetGroupSize = targetGroupSize.getText();
        }else{
            targetGroupSize.pseudoClassStateChanged(errorClass, true);
            OptionsDataCollector.targetGroupSize = targetGroupSize.getText();
        }
    });

    excludeChrY.selectedProperty().addListener(new ChangeListener<Boolean>() {
        public void changed(ObservableValue<? extends Boolean> ov,Boolean old_val, Boolean new_val) {
            OptionsDataCollector.excludeChrY = excludeChrY;
        }
    });

    writeMapFile.selectedProperty().addListener(new ChangeListener<Boolean>() {
        public void changed(ObservableValue<? extends Boolean> ov,Boolean old_val, Boolean new_val) {
            OptionsDataCollector.writeMapFile = writeMapFile;
        }
    });

    segPermFile.selectedProperty().addListener(new ChangeListener<Boolean>() {
        public void changed(ObservableValue<? extends Boolean> ov,Boolean old_val, Boolean new_val) {
            OptionsDataCollector.segPermFile = segPermFile;
        }
    });

    targetPermFile.selectedProperty().addListener(new ChangeListener<Boolean>() {
        public void changed(ObservableValue<? extends Boolean> ov,Boolean old_val, Boolean new_val) {
            OptionsDataCollector.targetPermFile = targetPermFile;
        }
    });
}

@FXML
private void loadDefaultValues() throws IOException {
    if(OptionsFileDefaults.inputOptionsFile == null){
        Alert alert = new Alert(Alert.AlertType.ERROR);
        alert.setTitle("Error Dialog");
        alert.setHeaderText("You Must First Import The File With The Default Settings!");
        //alert.setContentText("You Must First Import The File With The Default Settings!");
        alert.showAndWait();
    }else {
        defaultValues();
        segmentFile.setText(OptionsFileDefaults.getSegmentFile());
        segmentFile.pseudoClassStateChanged(errorClass, !pathValidate(segmentFile.getText()));
        OptionsDataCollector.segmentFile = segmentFile.getText();

        targetBedFile.setText(OptionsFileDefaults.getTargetBedFile());
        targetBedFile.pseudoClassStateChanged(errorClass, !pathValidate(targetBedFile.getText()));
        OptionsDataCollector.targetBedFile = targetBedFile.getText();

        cellName.setText(OptionsFileDefaults.getCellName());
        cellName.pseudoClassStateChanged(errorClass, !(!StringUtils.isBlank(cellName.getText()) && textValidate
                (cellName.getText())));
        OptionsDataCollector.cellName = cellName.getText();

        libraryName.setText(OptionsFileDefaults.getLibraryName());
        libraryName.pseudoClassStateChanged(errorClass, !(!StringUtils.isBlank(libraryName.getText()) &&
                textValidate(libraryName.getText())));
        OptionsDataCollector.libraryName = libraryName.getText();

        spawnJobs.setText(OptionsFileDefaults.getSpawnJobs());
        spawnJobs.pseudoClassStateChanged(errorClass, !(!StringUtils.isBlank(spawnJobs.getText()) &&
                !Objects.equals(spawnJobs.getText(), 0) && numberValidate(spawnJobs.getText())));
        OptionsDataCollector.spawnJobs = spawnJobs.getText();

        freqIterations.setText(OptionsFileDefaults.getFreqIterations());
        freqIterations.pseudoClassStateChanged(errorClass, !(!StringUtils.isBlank(freqIterations.getText()) &&
                !Objects.equals(freqIterations.getText(), 0) && numberValidate(freqIterations.getText())));
        OptionsDataCollector.freqIterations = freqIterations.getText();

        repeatCount.setText(OptionsFileDefaults.getRepeatCount());
        repeatCount.pseudoClassStateChanged(errorClass, !(!StringUtils.isBlank(repeatCount.getText()) &&
                !Objects.equals(repeatCount.getText(), 0) && numberValidate(repeatCount.getText())));
        OptionsDataCollector.repeatCount = repeatCount.getText();

        bedGroup.setText(OptionsFileDefaults.getBedGroup());
        bedGroup.pseudoClassStateChanged(errorClass, !(!StringUtils.isBlank(bedGroup.getText()) &&
                !Objects.equals(bedGroup.getText(), 0) && numberValidate(bedGroup.getText())));
        OptionsDataCollector.bedGroup = bedGroup.getText();

        progCheck.setText(OptionsFileDefaults.getProgCheck());
        progCheck.pseudoClassStateChanged(errorClass, !(!StringUtils.isBlank(progCheck.getText()) &&
                numberValidate(progCheck.getText())));
        OptionsDataCollector.progCheck = progCheck.getText();

        excludeChrY.setSelected(OptionsFileDefaults.isExcludeChrY());
        OptionsDataCollector.excludeChrY = excludeChrY;

        writeMapFile.setSelected(OptionsFileDefaults.isWriteMapFile());
        OptionsDataCollector.writeMapFile = writeMapFile;

        segPermFile.setSelected(OptionsFileDefaults.isSegPermFile());
        OptionsDataCollector.segPermFile = segPermFile;

        targetPermFile.setSelected(OptionsFileDefaults.isTargetPermFile());
        if(targetPermFile.isSelected()){targetGroupSize.pseudoClassStateChanged(hiddenClass, false);}
        OptionsDataCollector.segPermFile = segPermFile;

        targetGroupSize.setText(OptionsFileDefaults.getTargetGroupSize());
        targetGroupSize.pseudoClassStateChanged(errorClass, !(!StringUtils.isBlank(targetGroupSize.getText()) &&
                !Objects.equals(targetGroupSize.getText(), 0) && numberValidate(targetGroupSize.getText())));
        OptionsDataCollector.targetGroupSize = targetGroupSize.getText();
    }
}
}

OptionsDataCollector类

package application.models;
import javafx.scene.control.CheckBox;
public class OptionsDataCollector{

OptionsDataCollector();
public static String runModule;
public static String segmentFile;
public static String targetBedFile;
public static String cellName;
public static String libraryName;
public static String spawnJobs;
public static String freqIterations;
public static String repeatCount;
public static String bedGroup;
public static String targetGroupSize;
public static String progCheck;
public static CheckBox excludeChrY = new CheckBox();
public static CheckBox writeMapFile = new CheckBox();
public static CheckBox targetPermFile = new CheckBox();
public static CheckBox segPermFile = new CheckBox();

public OptionsDataCollector(){
    targetGroupSize = "";
    excludeChrY.setSelected(false);
    writeMapFile.setSelected(false);
    targetPermFile.setSelected(false);
    segPermFile.setSelected(false);
}

public static void generateOptionsFile(){

    StringBuilder moduleSelected = new StringBuilder();

    moduleSelected = OptionsFileDefaults.moduleSelected(runModule);

    moduleSelected.append("--seg_copy_file\t").append(segmentFile).append("\n");
    moduleSelected.append("--target_bed_file\t").append(targetBedFile).append("\n");
    moduleSelected.append("--cell_name\t").append(cellName).append("\n");
    moduleSelected.append("--library\t").append(libraryName).append("\n");
    moduleSelected.append("--spawn\t").append(spawnJobs).append("\n");
    moduleSelected.append("--freq_calc_iterations\t").append(freqIterations).append("\n");
    moduleSelected.append("--repeat_count\t").append(repeatCount).append("\n");
    moduleSelected.append("--bed_group\t").append(bedGroup).append("\n");
    moduleSelected.append("--target_perm_group_size\t").append(targetGroupSize).append("\n");
    moduleSelected.append("--prog_check\t").append(progCheck).append("\n");

    if(excludeChrY.isSelected()){moduleSelected.append("--exclude_chrY\t").append("True\n");}
    else {moduleSelected.append("--exclude_chrY\t").append("False\n");}

    if(writeMapFile.isSelected()){moduleSelected.append("--writeMapFile\t").append("True\n");}
    else {moduleSelected.append("--writeMapFile\t").append("False\n");}

    if(segPermFile.isSelected()){moduleSelected.append("--seg_perm_file\t").append("True\n");}
    else {moduleSelected.append("--seg_perm_file\t").append("False\n");}

    if(targetPermFile.isSelected()){moduleSelected.append("--target_perm_file\t").append("True\n");}
    else {moduleSelected.append("--target_perm_file\t").append("False\n");}
    System.out.println(moduleSelected);

    OptionsFileDefaults.fileWriter(moduleSelected, runModule);
    }
}

任何人都有任何关于如何清理它并提高效率的想法?