Java setText来自另一个控制器,但UI不刷新

Java setText来自另一个控制器,但UI不刷新,java,javafx,Java,Javafx,我有两个控制器。我想从我的GlobalOptions FileNameController设置tf_文件名的值。该值已设置,我可以使用它,但文本字段不会更新视图(我看不到新值) 这是我的密码。Sry它可能是一个复制品,但我在其他岗位上找不到适合我的工作方式 package configHelp; import burninbuilder.GlobalOptionsController; import java.io.IOException; import java.net.URL; impor

我有两个控制器。我想从我的GlobalOptions FileNameController设置tf_文件名的值。该值已设置,我可以使用它,但文本字段不会更新视图(我看不到新值)

这是我的密码。Sry它可能是一个复制品,但我在其他岗位上找不到适合我的工作方式

package configHelp;

import burninbuilder.GlobalOptionsController;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

/**
 * FXML Controller class
 *
 * @author Sandro
 */
public class GlobalOptionsFileNameController implements Initializable {

    @FXML Button btn_help;
    @FXML RadioButton rb_local;
    @FXML RadioButton rb_server;
    @FXML TextField txt_filename;
    @FXML TextField txt_serverName;
    @FXML TextField txt_path;
    @FXML Button btn_addNr;
    @FXML Button btn_addDriveSN;
    @FXML Button btn_ok;

    Stage test = new Stage();

    GlobalOptionsController optionsController;
    public void getController() throws IOException{
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/burninbuilder/GlobalOptions.fxml"));
        Parent root = (Parent) loader.load();
        optionsController = loader.getController();
        System.out.println(this.optionsController);
    }

    public void setFileName(ActionEvent ev){
        if(rb_local.isSelected()){
            optionsController.setNameLocal(txt_filename.getText());
            System.out.println(optionsController.tf_fileName.getText());
        }else if(rb_server.isSelected()){
            String fileNameServer="//"+txt_serverName.getText()+"/"+txt_path.getText();
            optionsController.setNameLocal(fileNameServer);
        }   
    }

    public void test(){
        txt_filename.setText("test");
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        btn_ok.setOnAction(this::setFileName);
        try {
            getController();
        } catch (IOException ex) {
            Logger.getLogger(GlobalOptionsFileNameController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    

}
类中设置和刷新文本字段的位置

    package burninbuilder;

import configHelp.GlobalOptionsFileNameController;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.application.Platform;
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.control.CheckBox;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.stage.Modality;
import javafx.stage.Stage;
import logic.GlobalOptions;

public class GlobalOptionsController implements Initializable {

//
GlobalOptions globalOptionsSingleton = GlobalOptions.getInstance();

Stage fileNameOptions = new Stage();

@FXML public TextField tf_fileName;

    }
}

GlobalOptionsFileNameController fileAssistentController;
public void fileNameOptions(ActionEvent ev){
    try {
        if(fileNameOptions.getScene()==null){
            FXMLLoader loader = new FXMLLoader(getClass().getResource("/configHelp/globalOptionsFileName.fxml")); 
            Parent root = (Parent) loader.load();
            fileAssistentController = loader.getController();
            Scene scene = new Scene(root);
            fileNameOptions.setTitle("Assistent zum festlegen der Speicherorte und Dateinamen");
            fileNameOptions.getIcons().add(new javafx.scene.image.Image("pictures/app-icon.png")); 
            fileNameOptions.setScene(scene);
            fileNameOptions.setResizable(false);
            fileNameOptions.setAlwaysOnTop(true);
            fileNameOptions.initModality(Modality.APPLICATION_MODAL);

            fileNameOptions.show();
        }else{
            fileNameOptions.show();
        }             
        } catch (IOException ex) {
            System.out.println("AddWindow: "+ex);
        }
}

@FXML
public void setFileName(String name){
    Platform.runLater(new Runnable() {
    @Override
    public void run() {
        tf_fileName.setText("test");
        System.out.println("TextField:"+tf_fileName.getText());
    }
});
}

@FXML
public void setNameLocal(String name){
Platform.runLater(new Runnable() {
    public void run() {
        tf_fileName.setText(null);
        tf_fileName.setText(name);
    }
});
}


@Override
public void initialize(URL url, ResourceBundle rb) {
    filename_options.setOnAction(this::fileNameOptions);
    tabpane.setTabMinWidth(94);
    btn_ok.setOnAction(this::getGlobalOptions);
    cb_html.setOnMousePressed(this::setFileEx);
    tf_fileName.setOnMouseExited(this::addExTextField);
    tf_hour.setOnKeyTyped(this::onlyNumber);
    tf_min.setOnKeyTyped(this::onlyNumber);
    tf_duration.setOnKeyTyped(this::onlyNumber);
    tf_fail.setOnKeyTyped(this::onlyNumber);
    }
}

getController()
中检索的控制器与从未显示的UI元素(
root
,在
getController()
方法中本地声明)关联。因此,在该控制器实例上调用方法不能在UI中产生任何可见的效果。我假设您正在别处加载
GlobalOptions.fxml
文件并显示其内容。您需要一个从该加载器(不是您丢弃其加载内容的任意加载器)获得的控制器的引用

由于
globaloptioncontroller
中的
fileNameOptions(…)
方法中的代码已经引用了
globaloptionfilenamecontroller
,因此您可能应该使用该关系来传输信息

GlobalOptionsFileNameController
中创建只读
StringProperty
,并通过
setFileName(…)
方法进行设置:

public class GlobalOptionsFileNameController {

    // ...

    private ReadOnlyStringWrapper filename = new ReadOnlyStringWrapper();

    // ...

    public String getFilename() {
       return filename.get() ;
    }

    public ReadOnlyStringProperty filenameProperty() {
        return filename.getReadOnlyProperty();
    }

    public void setFileName(ActionEvent ev){
        if(rb_local.isSelected()){
            filename.set(txt_filename.getText());
        }else if(rb_server.isSelected()){
            String fileNameServer="//"+txt_serverName.getText()+"/"+txt_path.getText();
            filename.set(fileNameServer);
        }   
    }

    // ...
}
您还可以从
GlobalOptionsFileNameController
中删除
GlobalOptionsController
引用和
getController()
方法

现在在
globaloptioncontroller
中,只需观察属性并在文本字段发生更改时更新它:

public class GlobalOptionsController {

    // ...

    public void fileNameOptions(ActionEvent ev){
        try {
            if(fileNameOptions.getScene()==null){
                FXMLLoader loader = new FXMLLoader(getClass().getResource("/configHelp/globalOptionsFileName.fxml")); 
                Parent root = (Parent) loader.load();
                GlobalOptionsFileNameController fileAssistentController = loader.getController();

                fileAssistentController.filenameProperty().addListener((obs, oldFilename, newFilename) -> 
                    tf_fileName.setText(newFilename));

                Scene scene = new Scene(root);
                fileNameOptions.setTitle("Assistent zum festlegen der Speicherorte und Dateinamen");
                fileNameOptions.getIcons().add(new javafx.scene.image.Image("pictures/app-icon.png")); 
                fileNameOptions.setScene(scene);
                fileNameOptions.setResizable(false);
                fileNameOptions.setAlwaysOnTop(true);
                fileNameOptions.initModality(Modality.APPLICATION_MODAL);

                fileNameOptions.show();
            }else{
                fileNameOptions.show();
            }             
            } catch (IOException ex) {
                System.out.println("AddWindow: "+ex);
            }
    }

    // ...

}

你能把相关的代码贴出来吗?抛开你所有的东西会让人们更难理解,也可能会让更少的人被你的问题吸引。是的,sry。我编辑代码谢谢你的awnser。你能给我看一点代码吗?1.我必须使用GlobalOptions.FXML 2创建一个FXML加载程序。加载()加载程序,但使用什么?如果不是根元素?3.在GlobalOptions.fxml中使用不同方法的控制器是否正确?如果不是在另一个控制器中,您对其他控制器意味着什么?