Java 从控制台读取URL并在GUI的文本区域中打印

Java 从控制台读取URL并在GUI的文本区域中打印,java,swing,Java,Swing,我正在从事“使用JavaRMI的分布式网络爬虫”项目。 web会抓取页面并在两个控制台上显示URL——一个是客户端控制台,另一个是服务器控制台。 我的问题是,我必须从控制台读取这些URL,并将其显示在窗口的文本区域下。我已经尝试了很多,但URL没有显示在文本区域。 然而,它们被显示在控制台上 我的代码是: import java.net.*; import java.io.*; import java.util.Date; import java.io.File; import org.jsou

我正在从事“使用JavaRMI的分布式网络爬虫”项目。 web会抓取页面并在两个控制台上显示URL——一个是客户端控制台,另一个是服务器控制台。 我的问题是,我必须从控制台读取这些URL,并将其显示在窗口的文本区域下。我已经尝试了很多,但URL没有显示在文本区域。 然而,它们被显示在控制台上

我的代码是:

import java.net.*;
import java.io.*;
import java.util.Date;
import java.io.File;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.Channels;
import java.rmi.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class UCDemo implements ActionListener {
    static String dispServerURL;
    JFrame f1;
    JPanel p1;
    JLabel l1;
    JLabel l2;
    JTextField t1;
    JTextArea t2;
    JButton b1;

    public void showFrame() {
        f1 = new JFrame("Web Crawler");
        p1 = new JPanel();
        f1.setSize(7000, 7000);
        f1.setVisible(true);
        f1.setBackground(Color.pink);
        f1.getContentPane().add(p1);
        l1 = new JLabel("Enter seed URL");
        t1 = new JTextField(100);
        b1 = new JButton("Start");
        l2 = new JLabel("Result");
        t2 = new JTextArea(200, 200);

        p1.add(l1);
        p1.add(t1);
        p1.add(b1);
        p1.add(l2);
        p1.add(t2);

        b1.addActionListener(this);
    }

    public void actionPerformed(ActionEvent ae) {
        try {
            DispServerIntf dispServerIntf = (DispServerIntf) Naming.lookup(dispServerURL);
            if (ae.getSource() == b1) {
                String n1, k;
                InputStreamReader ir = new InputStreamReader(System.in);
                n1 = t1.getText();
                int c = 0;
                Document document = null;
                URL hp = new URL(n1);
                URLConnection hpcon = hp.openConnection();

                try {
                    document = Jsoup.parse(hp, 3000);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                for (Element element : document.getElementsByTag("a")) {
                    c++;
                    ReadableByteChannel rbc = Channels.newChannel(hp.openStream());
                    FileOutputStream fos = new FileOutputStream("te.html");
                    fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
                    if (c <= 7) {
                        Document doc_tmp = null;
                        URL hp_tmp = new URL(element.attr("href"));
                        t2.setText("" + hp_tmp);
                        URLConnection hpcontmp = hp_tmp.openConnection();
                        /**
                         * try { doc_tmp=Jsoup.parse(hp_tmp,3000); }
                         * catch(IOException e) {e.printStackTrace(); } for
                         * (Element ele: doc_tmp.getElementsByTag("a")) {
                         * System.out.println(ele.attr("href")); }
                         **/
                        ReadableByteChannel rbc_tmp = Channels.newChannel(hp_tmp.openStream());
                        FileOutputStream fos_tmp = new FileOutputStream("te" + c + ".html");
                        fos_tmp.getChannel().transferFrom(rbc_tmp, 0, Long.MAX_VALUE);

                    } else {
                        dispServerIntf.send(element.attr("href"));
                    }
                }
                /**
                 * BufferedReader in=new BufferedReader(new
                 * InputStreamReader(hpcon.getInputStream())); String inputline;
                 * while((inputline=in.readLine())!=null)
                 * System.out.println(inputline); in.close();
                 **/
            }
        } catch (Exception e) {
        }
    }

    public static void main(String args[]) {
        dispServerURL = "rmi://" + args[0] + "/DispServer";

        new UCDemo().showFrame();
    }
}
import java.net.*;
导入java.io.*;
导入java.util.Date;
导入java.io.File;
导入org.jsoup.jsoup;
导入org.jsoup.nodes.Document;
导入org.jsoup.nodes.Element;
导入java.nio.channels.ReadableByteChannel;
导入java.nio.channels.channels;
导入java.rmi.*;
导入java.util.*;
导入java.awt.*;
导入javax.swing.*;
导入java.awt.event.*;
类UCDemo实现ActionListener{
静态字符串dispServerURL;
jf1帧;
JPanel-p1;
jlabell1;
jlabell2;
jtextfieldt1;
jtext2区;
按钮b1;
公共空间展示架(){
f1=新的JFrame(“网络爬虫”);
p1=新的JPanel();
f1.设置尺寸(7000、7000);
f1.setVisible(真);
f1.退根地(颜色:粉红色);
f1.getContentPane().add(p1);
l1=新的JLabel(“输入种子URL”);
t1=新的JTextField(100);
b1=新的按钮(“开始”);
l2=新的JLabel(“结果”);
t2=新的JTextArea(200200);
p1.添加(l1);
p1.添加(t1);
p1.添加(b1);
p1.添加(l2);
p1.添加(t2);
b1.添加ActionListener(本);
}
已执行的公共无效行动(行动事件ae){
试一试{
DispServerIntf DispServerIntf=(DispServerIntf)命名.查找(dispServerURL);
如果(ae.getSource()==b1){
字符串n1,k;
InputStreamReader ir=新的InputStreamReader(System.in);
n1=t1.getText();
int c=0;
单据=空;
URL hp=新的URL(n1);
URLConnection hpcon=hp.openConnection();
试一试{
document=Jsoup.parse(hp,3000);
}捕获(IOE异常){
e、 printStackTrace();
}
for(元素:document.getElementsByTag(“a”)){
C++;
ReadableByteChannel rbc=Channels.newChannel(hp.openStream());
FileOutputStream fos=新的FileOutputStream(“te.html”);
fos.getChannel().transferFrom(rbc,0,Long.MAX_值);

如果(c一个问题是,您正在
actionPerformed
方法中的AWT线程(“事件分派线程”)上的一个循环中执行所有工作,并在该循环中更新GUI

这意味着GUI将无法正确更新(因为更新GUI的线程正在忙于HTML解析工作,无法自由处理GUI事件)。您可能需要在单独的线程中执行主循环,然后使用
invokeLater()
在AWT线程中更新GUI

见:

  • ,例如
  • 以及相关的介绍
  • 关于这个话题的官员,假设你读过
  • …教训
此外,您总是将文本设置为单个值,因此您只能看到最新的URL,而不是它们的列表:

t2.setText("" + hp_tmp);

您需要更详细地解释,并添加更多相关代码(理想情况下是一个可编译、可运行的示例,请参阅),在任何人都可能能够提供帮助之前。如果您想让人们不厌其烦地阅读,请正确格式化您的代码-我已编辑了问题并在此处为您完成了此操作。感谢您的代码编辑和宝贵的指导。我将尝试对其进行改进,并将进一步讨论…:)我阅读了本教程。由于我对java知之甚少,所以没有从中获得太多。我添加了更多的教程链接-了解线程模型对于编写在后台执行任何工作的Swing应用程序至关重要。