2012-05-06 31 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; 
    } 
} 

そして、ここでは私の第二のクラスである - 誤っSYMタイプ 互換性のないソースコード:プログラムをコンパイルした後、私は次のエラーメッセージを取得しています

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

あなたの最初のクラスのためにこれらの変更を試してみてください。オブジェクト指向スタイルでは、次のようなことを行います(非静的にする)。

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をインスタンス化します。 mainメソッドを終了すると、その参照は失われ、メソッドprintはそれを見つけることができません。速い解決策は、あなたのクラスの静的メンバーにすることです(しかし、これは適切な方法ではありません)。

tutorialを読むことをお勧めしますが、もっと重要なのは、これらのすべてを取り除き、代わりにnewを使用してインスタンスを使用することです(メインメソッドを除く)。

0

メインメソッド内のファーストクラスのguiオブジェクトを作成すると、ローカル変数として機能します。

printメソッドからsetTextAreaを呼び出すときはいつでも、参照は許可されません。

ので@RameshKの正しい答えが用意されました

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を宣言する必要があります。しかし、私はそれをお勧めしません。 staticは非常に注意して使用しなければなりませんし、しばしば人々が間違って使用することがあります(ここにあるように)。最終的には、すべてを静的にする必要があり、問題が発生します。 –

+0

はい、あなたは正しいです、我々は静的な参照を持っている必要があります..他の賢明な私たちはメインのような静的メソッドからその参照を使用することはできません... –

関連する問題