当前位置: 首页 > 知识库问答 >
问题:

从另一个控制器JavaFX访问一个控制器中的textarea

锺离霖
2023-03-14

我有两个控制FXMLDocumentControllerFXMLOpenedCodeController。我正在读一本书的内容。来自FXMLDocumentController的txt文件,我希望将该文本放置在fxmldocodeconcontroller的文本区域中。代码在FXMLDocumentController中运行并读取良好,但当打开fxmldocopenedcodecontroller中的窗口时,从中读取的内容。文本内容在文本区域中不可见。我的系统。出来println显示String mine包含内容,但它不显示在FXMLOpenedCodeController的文本区域中。请帮助任何人。非常感谢。

FXMLDocumentController代码

public class FXMLDocumentController implements Initializable {

    @FXML
    private MenuItem open;

    @FXML
    private MenuItem about;

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        open.setOnAction(new EventHandler<ActionEvent>(){
            @Override
                    public void handle (ActionEvent event){
                try {
                    showSingleFileChooser();
                } catch (IOException ex) {
                    Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
                }
                    }            
        });
    }
    private void showSingleFileChooser() throws IOException {
        //Stage s = new Stage();        
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("ZEBRA file open...");
        FileChooser.ExtensionFilter exfil = new FileChooser.ExtensionFilter("TXT files (*.txt)", "*.txt");
        fileChooser.getExtensionFilters().add(exfil);
        File selectedFile = fileChooser.showOpenDialog(stage);
        if(selectedFile != null){
            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(getClass().getResource("FXMLOpenedCode.fxml"));
            AnchorPane frame = (AnchorPane) fxmlLoader.load();
            FXMLOpenedCodeController c = fxmlLoader.getController();
            //c.codeExecute = codeExecute;
            c.codeExecute.appendText(readFile(selectedFile));
            String mine;
            mine = readFile(selectedFile);
            //c.codeExecute.appendText(mine);
            System.out.println(mine);
            Parent root = FXMLLoader.load(getClass().getResource("FXMLOpenedCode.fxml"));
            Scene scene = new Scene(root);
            stage4.initModality(Modality.APPLICATION_MODAL);
            stage4.setTitle("Compile Code");
            stage4.setScene(scene);
            stage4.show();
        }   
    }

    private void newWindow() throws IOException{
        Parent root = FXMLLoader.load(getClass().getResource("FXMLNew.fxml"));
        Scene scene = new Scene(root);
        stage3.initModality(Modality.APPLICATION_MODAL);
        stage3.setTitle("Enter code to run here");
        stage3.setScene(scene);
        stage3.show();
    }

    private String readFile(File selectedFile) throws FileNotFoundException, IOException {
        StringBuilder content = new StringBuilder();
        BufferedReader buffRead = null;
        buffRead = new BufferedReader(new FileReader(selectedFile));
        String text;
        while((text = buffRead.readLine())!=null){
            content.append(text);
        }
        return content.toString();
    }
}

FXMLOpenedCodeController中,有一个公共文本区域codeExecute我删除了@FXMLprivate,这样代码就可以工作了。

共有1个答案

梁才
2023-03-14

您正在加载FXMLOpenedCode。fxml两次。您将文本放在第一次加载时得到的文本区域中,然后显示第二次加载时得到的UI。所以,很明显,你看不到文本,因为它被设置到了错误的文本区域。

只需加载FXML文件一次:

if(selectedFile != null){
    FXMLLoader fxmlLoader = new FXMLLoader();
    fxmlLoader.setLocation(getClass().getResource("FXMLOpenedCode.fxml"));
    AnchorPane frame = (AnchorPane) fxmlLoader.load();
    FXMLOpenedCodeController c = fxmlLoader.getController();
    //c.codeExecute = codeExecute;
    String mine;
    mine = readFile(selectedFile);
    c.codeExecute.appendText(mine);
    System.out.println(mine);

    Scene scene = new Scene(frame);
    stage4.initModality(Modality.APPLICATION_MODAL);
    stage4.setTitle("Compile Code");
    stage4.setScene(scene);
    stage4.show();
}   
 类似资料:
  • 需要你的帮助!这可能是更多的设计角度,但我在我的应用程序中使用这个模式,所以想得到一个想法。 我的问题是直接或间接地从一个控制器访问另一个控制器。是否有任何优雅的设计方法来做到这一点,而不是在另一个控制器中保留一个控制器的引用。 提前致谢

  • 我有两个控制器和。 在中,我有一个名为的方法。 如何在中访问此方法?

  • 和访问字段,如: 因为我希望有更好的方法来做到这一点。

  • 我知道有很多关于传递参数的线程,但我仍然不明白。 我有阶段与类。在这个类中,我创建了例如变量。然后我单击此阶段上的按钮,它使用创建新阶段,我可以在其中修改此值。在中是值的setter和getter方法。在中,我可以从中获取值并对其进行编辑,但最后当我关闭第二阶段时,我尝试通过中的setter方法将此编辑后的值设置为新数字。然后我关闭它,然后像第一次一样再次打开它。但是我看不到新的编辑值,我再次看到

  • 因此,我将一个名为“size”的整数保存到一个名为SettingsStageController的控制器类中。java和我希望通过另一个名为GameStageController的控制器类文件访问该变量。java,但我似乎不知道怎么做。 设置标记控制器。JAVA GameStageController.java

  • 问题内容: 我需要从另一个控制器内的另一个控制器访问方法。我该怎么做?我可以使用方法吗? 我可以在当前控制器中包含该控制器,并使其成为对象并通过该对象访问该方法吗?这样可以吗? 我想调用另一个控制器的表单方法— newAction。 问题答案: 您可以将控制器定义为服务,然后在另一个控制器中获取它。 在定义所需的控制器即服务中: 然后,在任何控制器中,您都可以通过容器获取此服务: 在文档中有一些关