Java 从控制台读取URL并在GUI的文本区域中打印
我正在从事“使用JavaRMI的分布式网络爬虫”项目。 web会抓取页面并在两个控制台上显示URL——一个是客户端控制台,另一个是服务器控制台。 我的问题是,我必须从控制台读取这些URL,并将其显示在窗口的文本区域下。我已经尝试了很多,但URL没有显示在文本区域。 然而,它们被显示在控制台上 我的代码是: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
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应用程序至关重要。