2016-05-08 16 views
1

我想要這樣做,如果我點擊btn_check,錯誤消息將出現在txt_msg(JTExtArea)上。我已經使用命令行完成了這段代碼,它工作。這只是我想在我的GUI中應用它。如何從主類調用textArea以便我可以在另一個類中使用它?

這是我的主類

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_txt_msg.setText(m.toString()),但沒有奏效。

+0

我想這應該和'mainclass.JTextArea.getText()'一樣簡單,但如果不是,你需要一個' setter'和一個'getter'。 –

回答

0

從您提供的代碼中看不清楚,但是從我在此處看到的您創建的新解析器對象中,您沒有像以前那樣調用parse()方法。如果是這樣的問題,你將需要:

  • 創建一個新的構造爲您解析類,它獲取兩個掃描儀和JTextArea中
  • 調用解析()方法就可以了
  • 具有解析( )方法調用你的Report_Error()方法現在
  • 在parse()方法,你就可以調用的setText()

是我的建議不過,如果可以的話,就是讓你解析()方法來返回錯誤消息(或上午礦物複雜對象持有消息和某種返回代碼),並直接在actionPerformed()內的JTextArea上調用setText()方法。通過這種方式,您將解耦純計算(輸入解析)和GUI管理(dislpay計算結果)。

另外,看看SwingWorker類;如果你的解析可以是一個長操作,從actionPerformed()方法調用它可能會掛起你的GUI

+0

感謝您的建議。我問過我的老師,他也這麼說。但我不能改變方法'report_error()'的數據類型,因爲它是類解析器中的默認類型(解析器擴展了java_cup.runtime.lr_parser')。所以,我試圖將值m傳遞給其他方法(我創建了一個新方法'write()'),它可以返回m的值。我現在的問題是我不知道如何調用Main中的方法。你能幫我嗎? :) –

+0

我不認爲你需要另一種方法返回m,你已經有report_error() - 只是讓它返回m.toString()。 至於子類的問題,我需要更多的信息.​​..你重寫了parse()方法還是你使用超類實現?你如何使用report_error()方法? – Antiphon0x

+0

我試過了,它說它不兼容:( –

相關問題