扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:开发者在线 来源:开发者在线 2007年8月2日
关键字:
添加功能
目前,我们已经实现了我们想要得GUI行为,下面我们将注意力放在本框架的目的上——显示来自flickr RSS查询的图像。
然而,我们并不能简单地获取查询结果并假定我们可以使用java基类处理XML结果,我们可以不断尝试,但工作量之大使得我们得不偿失。
幸运的是已经存在一个称为Rome的项目可以处理这个问题。当你下载Rome时,请务必同时下载它的依赖JDOM。
正如本例所示,Rome的目的是让我们快速且简单地获得和提取来自RSS的结果。因为我们只对当用户按下搜索按钮的动作感兴趣,所以使用Rome的代码中应该包含在一个事件监视器中。
我们在按钮上添加一个事件监听器:
searchBtn.addActionListener(new GridBagAL());
Our listening class looks like this:
class GridBagAL implements ActionListener{
public void actionPerformed(ActionEvent e) {
try{
URLfeedUrl=new URL("http://api.flickr.com/services/feeds/photos_public.gne?tags="+URLEncoder.encode(tagTxt.getText(),"UTF-8") +"&tagmode="+modeCombo.getSelectedItem().toString()+"&format=rss_200_enc");
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = input.build(new XmlReader(feedUrl));
Vector tableData = new Vector();
for(Object ent: feed.getEntries()){
SyndEntryImpl sei = (SyndEntryImpl) ent;
for(Object enc_ent: sei.getEnclosures()){
SyndEnclosureImpl senci = (SyndEnclosureImpl) enc_ent;
Vector vectmp = new Vector();
vectmp.add(new FlickrTableEntry(sei.getTitle(), senci.getUrl()));
tableData.add(vectmp);
}
}
Vector colNames = new Vector();
colNames.add("Pictures");
resTable.setModel(new DefaultTableModel(tableData, colNames));
}
catch (Exception ex){
ex.printStackTrace();
System.out.println("ERROR: "+ex.getMessage());
}
}
}
当调用时监听器的作用是创建我们想要获得的URL,编码文本域的文本并选择组合框内的模式。然后利用Rome,它可以将查询结果转换成一个SyndFeed对象。最后使用一个向量来保存查询结果中我们感兴趣的日期。
想要了解为什么我们会对查询结果的封装信息感兴趣,可以看一下结果的来源:
http://api.flickr.com/services/feeds/photos_public.gne?tags=dog,cat&tagmode=any&format=rss_200_enc。如果我们需要的仅仅是显示在JTable中的每个入口的标题以及现在在图像标签中的图像url。那么我们可以很容易的从封装头部获得这些信息。
为了帮助显示这些信息,我们创建了一个FlickrTableEntry类,其中保存了图像标题和URL。代码如下所示:
class FlickrTableEntry{
private String title, picture;
public FlickrTableEntry(String title, String picture){
this.title = title;
this.picture = picture;
}
public String getTitle(){return title;}
public String getPicture(){return picture;}
public String toString(){return title;}
}
在保存表数据之后,我们可以创建另外一个向量来设置表格的列字段名字并通过创建一个新的表格模型来更新数据表,该表格模型中包含了新的表数据和列字段名。
为了可以使我们的代码能够编译,我们需要包含下面的头文件:
import java.util.Vector;
//Rome imports
import java.net.*;
import java.io.InputStreamReader;
import com.sun.syndication.feed.module.*;
import com.sun.syndication.feed.synd.*;
import com.sun.syndication.io.*;
import org.jdom.Document;
当我们试验这些代码时,可以看到表格中填充了来自图像的标题。最后的工作是将这些图像显示在图像标签中。为此我们需要使用一个ListSelectioListener,我们添加以下代码来初始化数据表。
resTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
ListSelectionModel rowSM = resTable.getSelectionModel();
rowSM.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
//Ignore extra messages.
if (e.getValueIsAdjusting()) return;
ListSelectionModel lsm = (ListSelectionModel)e.getSource();
if (lsm.isSelectionEmpty()) {
//No rows are selected
} else {
int selectedRow = lsm.getMinSelectionIndex();
FlickrTableEntryfte=(FlickrTableEntry) resTable.getValueAt(selectedRow, 0);
previewLbl.setText(fte.getTitle());
try{
previewLbl.setIcon(newImageIcon(new URL(fte.getPicture())));
} catch (Exception ex){
ex.printStackTrace();
System.out.println("ERROR: "+ex.getMessage());
}
}
}
});
我们还需要下面的头文件:
Import javax swing.event.*;
现在我们实现了希望的全部功能。当我们从结果表中选择一个标题时,与之相关的图像显示在图像标签处。
包装
现在我们有了一个框架,它看起来像我们希望的那样,作用也正如我们期望的一样。当然这只是一个演示网格包布局与RSS如何相结合的例子,因此还有很多地方可以继续改进,比如线程化接口。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者