Java 我如何从主类调用textArea,以便在另一个类中使用它?

Java 我如何从主类调用textArea,以便在另一个类中使用它?,java,jtextarea,Java,Jtextarea,我想这样做,如果我点击btn_检查,错误消息将出现在txt_消息(JTExtArea)。我已经使用命令行完成了这段代码,它很有效。只是我想在我的GUI中应用它 这是我的主课 public void actionPerformed(ActionEvent e) { Object click = e.getSource(); if (click == btn_check){ BufferedReader br = null; try {

我想这样做,如果我点击btn_检查,错误消息将出现在txt_消息(JTExtArea)。我已经使用命令行完成了这段代码,它很有效。只是我想在我的GUI中应用它

这是我的主课

public void actionPerformed(ActionEvent e) {
    Object click = e.getSource();

    if (click == btn_check){
        BufferedReader br = null;

        try {

            String line;
            br = new BufferedReader(new FileReader(txt_file.getText()));
            StringBuilder sb = new StringBuilder();

            while ((line = br.readLine()) != null) {
                sb.append(line + "\n");
            } // end while in try

            String everything = sb.toString();

        } catch (IOException error) {
            error.printStackTrace();

        } finally {
            try {
                if (br != null)br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        } //end try - catch - finally

        File filename = new File(txt_area.getText());

        try {
            txt_msg.setText("Yes in Main");
            // Scan file - read tokens
            Scanner scanner = new Scanner(new UnicodeEscapes(new FileReader(filename)));      

            //  Parse the file
            parser parser = new parser(scanner);
            parser.parse();

            parser p = new parser(txt_msg); //this is where I want to pass my text area to parser class

        } catch (Exception err) {
            syntax_err = true;
        }
    }
}
这是我的解析器类

JTextArea new_txt_msg;

public parser(JTextArea a) {
    new_txt_msg = a;
}

public void report_error(String message, Object info) {
StringBuffer m = new StringBuffer("Error ");

if (info instanceof java_cup.runtime.Symbol) 
  m.append( "("+info.toString()+")" );

m.append(" : "+message);

System.out.println(m); //m holds the error message
}

我尝试过使用
new\u txt\u msg.setText(m.toString())
,但它不起作用。

从您提供的代码中看不清楚,但从我这里看到的情况来看,您正在创建一个新的parser对象,在这个对象上,您没有像以前那样调用parse()方法。如果这是问题所在,您需要:

  • 为解析器类创建一个新的构造函数,该类同时获取Scanner和JTextArea
  • 对其调用parse()方法
  • 让parse()方法调用您的report\u error()方法
  • 现在,在parse()方法中,您将能够调用setText()
但是,如果可以的话,我建议您让parse()方法返回错误消息(或者是一个更复杂的对象,其中包含消息和某种返回代码),并直接在actionPerformed()中调用JTextArea上的setText()方法。通过这种方式,您将分离纯计算(输入解析)和GUI管理(解析计算结果)


另外,看一看课堂;如果您的解析可能是一个很长的操作,那么从actionPerformed()方法调用它可能会挂起您的GUI

从您提供的代码中看不清楚,但是从我这里看到的情况来看,您正在创建一个新的parser对象,在这个对象上,您没有像以前那样调用parse()方法。如果这是问题所在,您需要:

  • 为解析器类创建一个新的构造函数,该类同时获取Scanner和JTextArea
  • 对其调用parse()方法
  • 让parse()方法调用您的report\u error()方法
  • 现在,在parse()方法中,您将能够调用setText()
但是,如果可以的话,我建议您让parse()方法返回错误消息(或者是一个更复杂的对象,其中包含消息和某种返回代码),并直接在actionPerformed()中调用JTextArea上的setText()方法。通过这种方式,您将分离纯计算(输入解析)和GUI管理(解析计算结果)


另外,看一看课堂;如果您的解析可以是一个很长的操作,那么从actionPerformed()方法调用它可能会挂起您的GUI

我猜它会像
mainclass.JTextArea.getText()
一样简单,但如果不是这样,您将需要一个
setter
getter
。我猜它会像
mainclass.JTextArea.getText()一样简单
但如果不是,您将需要一个
设置器
和一个
获取器
。谢谢您的建议。我问过我的一位老师,他也是这么说的。但是我不能更改方法
report\u error()
的数据类型,因为它是类内解析器的默认类型(
parser扩展了java\u cup.runtime.lr\u parser
)。因此,我试图将值m传递给另一个方法(我创建了一个新方法
write()
),它可以返回m的值。我现在的问题是我不知道如何调用Main中的方法。你能帮我吗?:)我认为您不需要其他方法来返回m,您已经有了report_error()-只需让它返回m.toString()。至于子类问题,我需要更多的信息。。。您是重写了parse()方法还是使用了超类实现?如何使用report_error()方法?我知道了,对不起,我不知道库。。。因此,我们必须回到前面的解决方案:当您定义parser的子类时,给它一个这样的构造函数:public myParser(Scanner in,JTextArea a){super(in);new_txt_msg=a;},然后调用new_txt_msg.setText(m.toString()),正如您首先想做的那样仍然无法工作:(没关系,我明天会告诉我的讲师。谢谢你。顺便说一句:)没有完整的代码,我不能再往前走了……祝你好运!:)谢谢你的建议。我问过我的一位老师,他也是这么说的。但是我不能更改方法
report\u error()
的数据类型,因为它是类内解析器的默认类型(
parser扩展了java\u cup.runtime.lr\u parser
)。因此,我试图将值m传递给另一个方法(我创建了一个新方法
write()
),它可以返回m的值。我现在的问题是我不知道如何调用Main中的方法。你能帮我吗?:)我认为您不需要其他方法来返回m,您已经有了report_error()-只需让它返回m.toString()。至于子类问题,我需要更多的信息。。。您是重写了parse()方法还是使用了超类实现?如何使用report_error()方法?我知道了,对不起,我不知道库。。。因此,我们必须回到前面的解决方案:当您定义parser的子类时,给它一个这样的构造函数:public myParser(Scanner in,JTextArea a){super(in);new_txt_msg=a;},然后调用new_txt_msg.setText(m.toString()),正如您首先想做的那样仍然无法工作:(没关系,我明天会告诉我的讲师。谢谢你,顺便说一句:)没有完整的代码,我不能再往前走了……祝你好运!:)