2012-05-06 77 views
1

在編寫我的程序時,當我嘗試從另一個類調用方法setTextArea()時,得到「無法找到符號信息」。編譯程序後我收到以下錯誤消息: 不可編譯的源代碼 - 錯誤的符號類型:gui.setTextArea找不到符號錯誤信息

這裏是我的代碼:

public class LinkExtractor { 

    public static void main(String[] args) throws IOException { 
     //Validate.isTrue(args.length == 1, "usage: supply url to fetch"); 
     String base = "http://uk.ask.com/web?q="; 
     String keyword ="flowers"; 
     String tale="&search=&qsrc=0&o=312&l=dir"; 
     String url =base+keyword+tale; 

     print("Fetching %s...", url); 

     Document doc = Jsoup.connect(url).get(); 
     Elements links = doc.select("a[href]"); 

     print("\nLinks: (%d)", links.size()); 
     for (Element link : links) { 
      print(" * a: <%s> (%s)", link.attr("abs:href"), trim(link.text(), 35)); 
     AssistantGUI gui=new AssistantGUI(); 

     } 
    } 

    public static void print(String msg, Object... args) { 
     ***//here is the problem line*** 
     gui.setTextArea(String.format(msg, args)); 

    } 

    private static String trim(String s, int width) { 
     if (s.length() > width) 
      return s.substring(0, width-1) + "."; 
     else 
      return s; 
    } 
} 

這裏是我的第二類:

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 

public class AssistantGUI { 
JFrame frame= new JFrame("TextArea frame"); 
JPanel panel=new JPanel(); 
JTextArea text= new JTextArea("",5,20); 


public AssistantGUI(){ 

frame.add(panel); 
panel.add(text); 
frame.setSize(250,200); 
frame.setVisible(true); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 
public void setTextArea(String myString){ 
text.append(myString); 
} 
public static void main(String[] args){ 
AssistantGUI gui= new AssistantGUI(); 

gui.setTextArea("Hello"); 
} 

} 

我讀了很多有類似問題的帖子,但找不到解決方案。一切看起來都很好。我創建了AssistantGUI的一個實例,然後我使用它來調用setTextArea()方法,爲什麼它不能識別它?有任何想法嗎?我會很感激你的幫助。

回答

1

現在有@RameshK的正確答案。在面向對象的風格:做這樣的事情(使事物非靜態):

AssistantGUI gui = new AssistantGUI(); 

public static void main(String[] args) throws IOException { 
    new LinkExctractor().execute(); 
} 

private void execute() { 
    //Validate.isTrue(args.length == 1, "usage: supply url to fetch"); 
    String base = "http://uk.ask.com/web?q="; 
    String keyword ="flowers"; 
    String tail = "&search=&qsrc=0&o=312&l=dir"; 
    String url = base + keyword + tail; 

    print("Fetching %s...", url); 

    Document doc = Jsoup.connect(url).get(); 
    Elements links = doc.select("a[href]"); 

    print("\nLinks: (%d)", links.size()); 
    for (Element link : links) { 
     print(" * a: <%s> (%s)", link.attr("abs:href"), trim(link.text(), 35)); 
    } 
} 

private void print... 
0

您還沒有申報gui,所以很自然地找不到它。用不同的方法聲明局部變量不計數。

0

在您的第一堂課中,您將在主要方法中實例化gui局部變量。一旦退出主方法,該引用將丟失,並且方法打印無法找到它。一個快速的解決方案是使gui成爲你的類的靜態成員(但這不是正確的方法)。

考慮閱讀這個tutorial,但更重要的是,儘量去除所有那些static(主方法必須保持靜態除外),並使用new來代替使用實例。

0

您在main方法內的第一個類中創建gui對象,它將充當局部變量。

無論何時從print方法調用setTextArea,引用都不允許在那裏。

所以嘗試這些改變你的第一類

public class LinkExtractor { 
    public static AssistantGUI gui=new AssistantGUI(); // create the object 
    public static void main(String[] args) throws IOException { 
     //Validate.isTrue(args.length == 1, "usage: supply url to fetch"); 
     String base = "http://uk.ask.com/web?q="; 
     String keyword ="flowers"; 
     String tale="&search=&qsrc=0&o=312&l=dir"; 
     String url =base+keyword+tale; 

     print("Fetching %s...", url); 

     Document doc = Jsoup.connect(url).get(); 
     Elements links = doc.select("a[href]"); 

     print("\nLinks: (%d)", links.size()); 
     for (Element link : links) { 
      print(" * a: <%s> (%s)", link.attr("abs:href"), trim(link.text(), 35)); 


     } 
    } 

    public static void print(String msg, Object... args) { 
     ***//here is the problem line*** 
     gui.setTextArea(String.format(msg, args)); 

    } 

    private static String trim(String s, int width) { 
     if (s.length() > width) 
      return s.substring(0, width-1) + "."; 
     else 
      return s; 
    } 
} 
+0

您必須聲明gui靜態爲此工作。但我不會推薦。應該非常小心地使用靜電,並且通常人們不正確地使用它(因爲在這種情況下)。最終,你需要將所有東西都變成靜態的,這樣你就會陷入困境。 –

+0

是的你是對的,我們需要有靜態引用..其他明智的是,我們不允許使用靜態方法,如主... –