2016-04-11 2 views
4

Je suis un programmeur Java débutant, finissant la classe "Java 101" à mon université locale. Je me pousse aussi à apprendre quelques sujets supplémentaires sur le côté, y compris Java FX. J'ai travaillé sur les didacticiels Java FX sur le site Web d'Oracle, j'ai regardé quelques vidéos YouTube et j'ai lu "Java FX for Dummies" (qui était le meilleur livre que je pouvais trouver pour un débutant.) Tout ce matériel m'a appris Beaucoup de bases, mais certaines choses qui (devraient être) relativement simples m'échappent. Par exemple: Disons que j'ai un programme Java FX qui utilise plusieurs scènes sur une scène. Lorsque l'utilisateur clique sur un "Switch!" bouton, la deuxième scène est permutée pour la première. Facile. Je peux faire tout cela dans un fichier. Java, pas de problème. (Voir le code ci-dessous)Pouvez-vous écrire deux scènes Java FX différentes en deux classes distinctes?

Mais mon fichier de classe .java devient vraiment long et lourd à dépanner. Ce serait génial si je pouvais définir/déclarer/initialiser une scène comme une classe dans un fichier .java et la deuxième scène comme une autre classe dans un autre fichier .java. Cela rendrait beaucoup plus facile le suivi des composants de chaque scène. Le problème est, je ne peux pas comprendre comment faire cela.

J'imagine que vous écririez une classe Scene1.java puis une classe Scene2.java, et que vous passeriez simplement l'objet stage entre les deux lorsque vous voulez changer de scène. Mais je ne peux pas trouver un exemple de la façon dont cela est fait, et toutes mes tentatives se traduisent par des erreurs de compilation ou des erreurs d'exécution vraiment effrayantes.

Est-ce que quelqu'un sait comment cela peut être fait? Si oui, que dois-je faire pour modifier la méthode SwitchScenes2() ci-dessous pour créer le nouvel objet Scene2 et lui passer la scène?

Merci! RAO

/* 
    JavaFXExample.java 
*/ 

import javafx.application.*; 
import javafx.stage.*; 
import javafx.scene.*; 
import javafx.scene.layout.*; 
import javafx.scene.control.*; 
import javafx.event.*; 
import javafx.geometry.*; 

public class JavaFXExample extends Application{ 

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

Button btnSw1; 
Button btnSw2; 
Button btnClose; 
HBox hbox1; 
VBox vbox1; 
Scene scene1; 
Scene scene2; 
Stage stage; 

@Override public void start(Stage primaryStage){ 
    btnSw1 = new Button("Switch Scenes!"); 
    btnSw1.setOnAction(
     e -> SwitchScenes2()); 
    btnSw2 = new Button("Switch back!"); 
    btnSw2.setOnAction(
     e -> SwitchScenes1()); 
    btnClose = new Button(); 
    btnClose.setText("Close me!"); 
    btnClose.setOnAction(e -> CloseWindowClick()); 

    hbox1 = new HBox(10); 
    hbox1.getChildren().addAll(btnSw1); 
    vbox1 = new VBox(10); 
    vbox1.getChildren().addAll(btnSw2, btnClose); 

    scene1 = new Scene(hbox1, 300, 300); 
    scene2 = new Scene(vbox1, 200, 400); 

    stage = primaryStage; 
    stage.setScene(scene1); 
    stage.setTitle("Example App"); 
    stage.show(); 
    } 

    public void SwitchScenes1(){ 
     stage.setScene(scene1); 
    } 
    public void SwitchScenes2(){ 
     stage.setScene(scene2); 
    } 
    public void CloseWindowClick(){ 
     stage.close(); 
    } 
} 
+0

question connexe: http://stackoverflow.com/questions/32464698/java-how-do-i-start-a-standalone-application-from-the-current-one-when-both -sont –

Répondre

1

Pete que je comprends que vous souhaitez séparer un gros fichier java dans de petits fichiers, créer des classes Java dans chaque classe, créez une méthode (fonction) qui renverra la disposition (HBox, VBox, Flowpane ou ....) puis créez dans votre main un objet de cette classe Java et utilisez ces méthodes pour construire sur une grande application.

Dans mon exemple, j'ai créé une classe principale et une classe séparée avec une seule fonction, juste pour vous montrer comment cela fonctionne. Dans mon principal, il y a 2 lables, 2 boutons d'une mise en page et un objet de la classe séparée, en cliquant sur les scènes de touches changent Mon principal:

public class SwitchSceneSample extends Application { 
public static void main(String[] args) { 
    launch(args); 
} 

Stage window; 
Scene scene1, scene2; 

@Override 
public void start(Stage primaryStage) throws Exception { 
    // I am using window as primaryStage 
    window = primaryStage; 
    // Label 1 
    Label label1 = new Label("Welcome to the first scene!"); 
    // Label 2 
    Label label2 = new Label("This is second scene!"); 
    // Button 1, by pressing this button primaryStage will be set as scene 2 
    Button button1 = new Button("Go to scene 2"); 
    button1.setOnAction(e -> window.setScene(scene2)); 
    // Button 2, by pressing this button primaryStage will be set as scene 1 
    Button button2 = new Button("Click to go scene 1"); 
    button2.setOnAction(e -> window.setScene(scene1)); 
    // Creating an object of the class'LayoutOne.java' 
    LayoutOne l1 = new LayoutOne(); 
    // set my scene 1(by calling method called 'sceneView1()' from class 'LayoutOne.java') 
    scene1 = new Scene(l1.sceneView1(label1, button1), 200, 200); 
    // Set my scene 2 inside my main class 
    StackPane layout2 = new StackPane(); 
    layout2.getChildren().addAll(label2, button2); 
    scene2 = new Scene(layout2, 600, 300); 
    // Making my 
    window.setScene(scene1); 
    window.setTitle("Scene Switch Sample"); 
    window.show(); 
} 

}

Ma deuxième classe:

public class LayoutOne { 
public VBox sceneView1(Label label, Button button) { 

    // Layout 1 - children are laid out in vertical column 
    VBox layout1 = new VBox(20); 
    layout1.getChildren().addAll(label, button); 

    return layout1; 
} 

}

1

Ce que vous voulez faire est de créer des classes séparées qui ont toutes les deux des fonctions pour retourner la scène. De là, vous voudrez initialiser ces classes et avec un bouton appeler une fonction qui ajoutera des données à ces scènes ou créer une nouvelle scène vierge (comme un moyen rapide de "supprimer" la scène). Mais si vous voulez un moyen plus professionnel de basculer entre des scènes comme celle-ci, vous voudrez vérifier le TabPane().

Scene1 scene1 = new Scene1(); 
Scene2 scene2 = new Scene2(); 

TabPane tabPane = new TabPane(); 
Tab tab1 = new Tab(); 
tab1.setContent(scene1); 
tabPane.getTabs().add(tab1); 
Tab tab2 = new Tab(); 
tab2.setContent(scene2); 
tabPane.getTabs().add(tab2); 
1
  1. Créer une classe Manager qui contient la principale méthode & initialiser le premier écran. par exemple.

public class VMCSManager étend l'application {

private Parent content; 
private static VMCSManager instance; 

public VMCSManager() { 
    instance=this; 
} 

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

public static VMCSManager getInstance() { 
    return instance; 
} 

@Override 
public void start(Stage primaryStage) throws Exception {  
    initializePanel(); 
    Scene scene = new Scene(content); 
    stageStyle(primaryStage); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

private void initializePanel() throws IOException{ 
    FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("fxml/SimulatorDisplay.fxml")); 
    content = loader.load(); 
} 

public void openCustomerPanel() throws IOException{ 
    FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("fxml/CustomerDisplay.fxml")); 
    content = loader.load(); 
    Scene scene = new Scene(content); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

}

    Créer
  1. classe principale du contrôleur pour le premier écran. par exemple;
  2. SimulatorController public class

implémente Initializable {

@FXML 
public void clickCustomer (ActionEvent event) throws IOException{ 
    log.info("Starting Customer Panel"); 
    VMCSManager.getInstance().openCustomerPanel(); 
} 
@FXML 
public void clickMaintainer(ActionEvent event) throws IOException{ 
    log.info("Starting Maintainer Panel"); 
    VMCSManager.getInstance().openMaintainerPanel(); 
} 

}

  1. Enfin créer la classe de contrôleur pour l'écran spécifié.eg`

CustomerController public class étend SimulatorController {

@FXML 
private Label brand1Lbl; 
@FXML 
private Label brand2Lbl; 
@FXML 
private Label brand3Lbl; 
@FXML 
private Label brand4Lbl; 
@FXML 
private Label brand5Lbl; 

@FXML 
private Label statusLbl1; 
@FXML 
private Label statusLbl2; 

private static final Logger log=LoggerFactory.getLogger(CustomerController.class); 

public CustomerController() { 
    context= new BuyingStateContext(); 
} 

public void initialize(URL location, ResourceBundle resources) { 
    this.location = location; 
    this.rb = resources; 
    coinsValidityFlash.setVisible(false); 
    insertCoinTxt.setDisable(true); 

    brand1Btn.setStyle("-fx-background-color: #CACACA;"); 
    brand2Btn.setStyle("-fx-background-color: #CACACA;"); 
    brand3Btn.setStyle("-fx-background-color: #CACACA;"); 
    brand4Btn.setStyle("-fx-background-color: #CACACA;"); 
    brand5Btn.setStyle("-fx-background-color: #CACACA;"); 

    populateVending(); 
} 
. 
. 
. 

}

`