2012-05-06 5 views
1

При написании моей программы я получил сообщение «не могу найти символьное сообщение», когда попытался вызвать метод setTextArea() из другого класса. После компиляции программы я получаю следующее сообщение об ошибке: Uncompilable исходного кода - ошибочный Тип: 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

Вы создаете объект gui в первом классе внутри основного метода, он будет действовать как локальная переменная.

всякий раз, когда вы вызываете 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

да, вы правы, нам нужно иметь статическую ссылку. Иными словами, нам не разрешено использовать эту ссылку из статического метода, такого как main ... –

Смежные вопросы