如何从 Java 控制器访问变量? JavaFX,场景构建器

问题描述

这是我的两个控制器,我想在 No_AdivinoController 中使用来自 JuegoController 的“ultimo”变量。 我有来自 JuegoController 的 getter 和 setter,但是当我想在 No_AdivinoController 中使用它时,出现 LoadException 错误或其他错误

这是 JuegoController 类。

package pantallas;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import tda.DecisionTree;
import static tda.DecisionTree.loadTree;

/**
 * FXML Controller class
 *
 * @author DELL
 */
public class JuegoController implements Initializable {
    
    private final DecisionTree<String> arbol = loadTree();
    private String ultimo;
    
    @FXML
    private Text pregunta;     
    private Button si;
    private Button no;
    private Button si2;
    private Button no2;
    
    public String getUltimo() {
        return ultimo;
    }

    public void setUltimo(String ultimo) {
        this.ultimo = ultimo;
    }
    
    @Override
    public void initialize(URL url,ResourceBundle rb) {
        mostrarPreguntas();                 
    }      
      
    public void mostrarPreguntas(){
        pregunta.setText(arbol.getRoot());
        pregunta.setVisible(true);        
    }

    public void positivo(ActionEvent event) throws IOException{         
        DecisionTree.Node<String> nodo = positivo(arbol);        
        String texto =  pregunta.getText().toString();        
        if(texto.contains("¡")){
            try{
                Parent root = FXMLLoader.load(getClass().getResource("/ventanas/Adivino.fxml"));
                Scene scene = new Scene(root);
                Stage appStage = (Stage) ((javafx.scene.Node) event.getSource()).getScene().getwindow();
                appStage.setScene(scene);
                appStage.toFront();
                appStage.show();
            }catch(IOException e){
                System.err.println(e);
            }
        }
        if(nodo.getYes()==null || nodo.getNo()==null){
            setUltimo(nodo.getData());            
            pregunta.setText("¡Creo que piensas en "+ nodo.getData()+"!"+" ¿Adiviné?");             
        }else{
            pregunta.setText(nodo.getData());
        }       
    }
    
    public DecisionTree.Node<String> positivo(DecisionTree<String> a){ 
        DecisionTree.Node<String> nodo = a.root;
        if(nodo.getYes()!=null) a.root=nodo.getYes();        
        return a.root;
    }
    
    public void negativo(ActionEvent event){
        DecisionTree.Node<String> nodo = negativo(arbol);        
        String texto =  pregunta.getText().toString();        
        if(texto.contains("¡")){
            try{
                Parent root = FXMLLoader.load(getClass().getResource("/ventanas/No_Adivino.fxml"));
                Scene scene = new Scene(root);
                Stage appStage = (Stage) ((javafx.scene.Node) event.getSource()).getScene().getwindow();
                appStage.setScene(scene);
                appStage.toFront();
                appStage.show();
            }catch(IOException e){
                System.err.println(e);
            }
        }
        if(nodo.getYes()==null || nodo.getNo()==null){            
            setUltimo(nodo.getData());            
            pregunta.setText("¡Creo que piensas en "+ nodo.getData()+"!"+" ¿Adiviné?");               
        }else{
            pregunta.setText(nodo.getData());
        }        
    } 
    
    public DecisionTree.Node<String> negativo(DecisionTree<String> a){
        DecisionTree.Node<String> nodo = a.root;
        if(nodo.getNo()!=null) a.root = nodo.getNo();
        return a.root;
    }
    
    public void adivino(ActionEvent event){
        try{
            Parent root = FXMLLoader.load(getClass().getResource("/ventanas/Adivino.fxml"));
            Scene scene = new Scene(root);
            Stage appStage = (Stage) ((javafx.scene.Node) event.getSource()).getScene().getwindow();
            appStage.setScene(scene);
            appStage.toFront();
            appStage.show();
        }catch(IOException e){
            System.err.println(e);
        }
    } 
    
    public void noAdivino(ActionEvent event){
        try{
            Parent root = FXMLLoader.load(getClass().getResource("/ventanas/No_Adivino.fxml"));
            Scene scene = new Scene(root);
            Stage appStage = (Stage) ((javafx.scene.Node) event.getSource()).getScene().getwindow();
            appStage.setScene(scene);
            appStage.toFront();
            appStage.show();
        }catch(IOException e){
            System.err.println(e);
        }
    } 

}

这是我的 No_AdivinoController 类。我使用了字符串“un perro”。运行我的代码,但这不是我想要的。我需要从 JuegoController 类中获取真正的 String。

package pantallas;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.scene.text.Text;
import tda.DecisionTree;
import static tda.DecisionTree.loadTree;

/**
 * FXML Controller class
 *
 * @author pc-4k
 */
public class No_AdivinoController implements Initializable { 
    
    private String animal;
    private String desc; 
    private String b;
    private JuegoController juegoController; 
    private final DecisionTree<String> arbol = DecisionTree.loadTree();
    @FXML        
    private Text descripcion;
    @FXML    
    private Text descripcion2;
    @FXML
    private Text advertencia;
    @FXML
    private Pane guardado;    
    @FXML
    private Pane campo_booleano;
    @FXML
    private Pane campo_respuesta;
    @FXML
    private TextField respuesta;
    @FXML
    private TextField pregunta;
    @FXML
    private TextField pregunta1;
    @FXML
    private Button guardar1;
    @FXML
    private Button guardar2;    
    @FXML
    private Button guardar3;  
    
    /**
     * Initializes the controller class.
     * @param url
     * @param rb
     */
  
    @Override
    public void initialize(URL url,ResourceBundle rb) {
        campo_booleano.setVisible(false);
        campo_respuesta.setVisible(false);
        advertencia.setText("");
        guardado.setVisible(false);
    } 
    
    public void guardarRespuesta(){      //validar si no ingresa signos o números  
        animal = respuesta.getText();        
        String ultimo = "un perro.";
        if(animal.isEmpty()){
            advertencia.setText("Por favor,llena todos los campos!!");            
        }else{
        animal = animal.strip();
        if(animal.endsWith("a")){
            animal = "una "+animal;
        }else if(!animal.startsWith("u")){
            animal = "un "+animal;
        }
        campo_respuesta.setVisible(true);           
        descripcion.setText("¿cual es la diferencia entre "+animal+" y "+ultimo+"?");
        }                
    }
    
    public void guardarPregunta(){    //validar si no ingresa signos o números         
        desc = pregunta.getText();
        if(desc.isEmpty()|| animal.isEmpty()){
            advertencia.setText("Por favor,llena todos los campos!!");
        }else{            
            campo_booleano.setVisible(true);
            desc+= "?";            
            descripcion2.setText("Para "+animal +" la respuesta a la pregunta: "+desc+" es Sí o No?");
        }           
    }
    
    public void guardarBoolean(){     //validar si no ingresa signos o números   //validar si ingresa si o no        
        b = pregunta1.getText();
        if(desc.isEmpty()|| animal.isEmpty()|| b.isEmpty()){
            advertencia.setText("Por favor,llena todos los campos!!");
        }else{ 
            String ultimo = "un perro.";//obtener el ultimo nodo con la funcion getUltimo();
            String b2 = b.toLowerCase();
            if(b2.contains("s")){
                System.out.println(b2);
                arbol.replace(ultimo,desc);
                arbol.add(animal,desc,true);
                arbol.add(ultimo,false);
            }if(b2.contains("n")){
                System.out.println(b2);
                arbol.replace(ultimo,false);
                arbol.add(ultimo,true);
            }
            arbol.saveTree();
            guardado.setVisible(true);            
        }  
    }
    
    public void borraradvertencia(){
        advertencia.setText("");
    }
    
    public void salir(ActionEvent event){
        try{
            Parent root = FXMLLoader.load(getClass().getResource("/ventanas/No_Adivino.fxml"));
            Scene scene = new Scene(root);
            Stage appStage = (Stage) ((javafx.scene.Node) event.getSource()).getScene().getwindow();
            appStage.setScene(scene);            
            appStage.close();
        }catch(IOException e){
            System.err.println(e);
        }
    }
    
    public void jugar(ActionEvent event){
        try{
            Parent root = FXMLLoader.load(getClass().getResource("/ventanas/Juego.fxml"));
            Scene scene = new Scene(root);
            Stage appStage = (Stage) ((Node) event.getSource()).getScene().getwindow();
            appStage.setScene(scene);
            appStage.toFront();
            appStage.show();
        }catch(IOException e){
            System.err.println(e);
        }
    }  
}

如您所见,它们在同一个包中,并且变量有它的 getter。 请帮帮我。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)