SWT(JFace)小制作:Bookmark
2009-06-25 10:11
363 查看
代码如下:
BookmarkOrganizer.java
BookmarkTransfer.java
mybookmark.htm
BookmarkOrganizer.java
package swt_jface.demo11; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSource; import org.eclipse.swt.dnd.DragSourceAdapter; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetAdapter; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; class Bookmark { public String name; public String href; public String addDate; public String lastVisited; public String lastModified; } public class BookmarkOrganizer { private static String folderLinePrefix = "<DT><H3 FOLDED"; private static String urlLinePrefix = "<DT><A HREF"; private static Pattern folderPattern = Pattern.compile("/"(//d+)/">(.*)<"); private static Pattern urlPattern = Pattern.compile("/"(.*)/".*/"(.*)/".*/"(.*)/".*/"(.*)/">(.*)<"); private static String KEY_ADD_DATE = "ADD_DATE"; //private static String KEY_HREF = "HREF"; //private static String KEY_LAST_VISITED = "LAST_VISITED"; //private static String KEY_LAST_MODIFIED = "LAST_MODIFIED"; Display display = new Display(); Shell shell = new Shell(display); Tree tree; Label label; TreeItem rootItem; Image iconRoot = new Image(display, "C:/icons/icon.gif"); Image iconFolder = new Image(display, "C:/icons/folder.gif"); Image iconURL = new Image(display, "C:/icons/file.gif"); TreeItem dragSourceItem; public BookmarkOrganizer() { shell.setText("Bookmark organizer"); shell.setLayout(new GridLayout(1, true)); ToolBar toolBar = new ToolBar(shell, SWT.FLAT); ToolItem itemOpen = new ToolItem(toolBar, SWT.PUSH); itemOpen.setText("Load"); itemOpen.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { FileDialog dialog = new FileDialog(shell, SWT.OPEN); String file = dialog.open(); if (file != null) { TreeItem[] items = rootItem.getItems(); for (int i = 0; i < items.length; i++) items[i].dispose(); loadBookmark(new File(file), rootItem); setStatus("Bookmarks loaded successfully"); } } }); ToolItem itemSave = new ToolItem(toolBar, SWT.PUSH); itemSave.setText("Save as"); itemSave.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { FileDialog dialog = new FileDialog(shell, SWT.SAVE); String file = dialog.open(); if (file != null) { try { BufferedWriter writer = new BufferedWriter(new FileWriter(file)); saveBookmark(writer, rootItem); writer.close(); setStatus( "Bookmarks saved successfully to file: " + file); } catch (IOException e) { e.printStackTrace(); } } } }); tree = new Tree(shell, SWT.BORDER); tree.setLayoutData(new GridData(GridData.FILL_BOTH)); rootItem = new TreeItem(tree, SWT.NULL); rootItem.setText("BOOKMARKS"); rootItem.setImage(iconRoot); label = new Label(shell, SWT.BORDER); label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); final DragSource dragSource = new DragSource(tree, DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK); dragSource.setTransfer( new Transfer[] { BookmarkTransfer.getInstance()}); dragSource.addDragListener(new DragSourceAdapter() { public void dragStart(DragSourceEvent event) { TreeItem[] selection = tree.getSelection(); if (selection.length > 0 && selection[0].getData() != null) { event.doit = true; dragSourceItem = selection[0]; } else { event.doit = false; } }; public void dragSetData(DragSourceEvent event) { if (BookmarkTransfer .getInstance() .isSupportedType(event.dataType)) event.data = dragSourceItem.getData(); } public void dragFinished(DragSourceEvent event) { if (event.detail == DND.DROP_MOVE) dragSourceItem.dispose(); dragSourceItem = null; } }); final DropTarget dropTarget = new DropTarget(tree, DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK); dropTarget.setTransfer( new Transfer[] { BookmarkTransfer.getInstance()}); dropTarget.addDropListener(new DropTargetAdapter() { public void dragOver(DropTargetEvent event) { event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL | DND.FEEDBACK_SELECT; } public void dropAccept(DropTargetEvent event) { if (event.item == null || ((TreeItem) event.item).getData() != null) event.detail = DND.DROP_NONE; } public void drop(DropTargetEvent event) { try { if (event.data == null) { event.detail = DND.DROP_NONE; return; } TreeItem item = new TreeItem((TreeItem) event.item, SWT.NULL); Bookmark bookmark = (Bookmark) event.data; item.setText(bookmark.name); item.setImage(iconURL); item.setData(bookmark); } catch (RuntimeException e) { e.printStackTrace(); } } }); tree.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { TreeItem item = (TreeItem) e.item; Bookmark bookmark = (Bookmark) item.getData(); if (bookmark != null) { setStatus(bookmark.href); } else if (item.getData(KEY_ADD_DATE) != null) { setStatus("Folder: " + item.getText()); } } }); shell.setSize(400, 300); shell.open(); loadBookmark(new File("C:/icons/mybookmark.htm"), rootItem); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } private void saveBookmark(BufferedWriter writer, TreeItem item) throws IOException { if (item.getData() == null && item.getData(KEY_ADD_DATE) == null) { writer.write( "<!DOCTYPE NETSCAPE-Bookmark-file-1>/n" + "<!-- This is an automatically generated file./n" + "It will be read and overwritten./n" + "Do Not Edit! -->/n" + "<TITLE>Bookmarks</TITLE>/n" + "<H1>Bookmarks</H1>/n" + "<DL><p>/n"); TreeItem[] items = item.getItems(); for (int i = 0; i < items.length; i++) saveBookmark(writer, items[i]); writer.write("</DL><p>/n"); } else if (item.getData() == null) { writer.write( "/t<DT><H3 FOLDED ADD_DATE=/"" + item.getData(KEY_ADD_DATE) + "/">" + item.getText() + "</H3>/n"); writer.write("/t<DL><p>/n"); TreeItem[] items = item.getItems(); for (int i = 0; i < items.length; i++) saveBookmark(writer, items[i]); writer.write("/t</DL><p>/n"); } else { Bookmark bookmark = (Bookmark) item.getData(); writer.write( "/t/t<DT><A HREF="/" mce_HREF="/""" + bookmark.href + "/" ADD_DATE=/"" + bookmark.addDate + "/" LAST_VISIT=/"" + bookmark.lastVisited + "/" LAST_MODIFIED=/" +" + bookmark.lastModified + "/">" + bookmark.name + "</A>/n"); } } private void loadBookmark(File file, TreeItem rootItem) { TreeItem parent = rootItem; try { BufferedReader reader = new BufferedReader(new FileReader(file)); String line = null; while ((line = reader.readLine()) != null) { line = line.trim(); if (line.startsWith(folderLinePrefix)) { Matcher matcher = folderPattern.matcher(line); if (matcher.find()) { String addDate = matcher.group(1); String name = matcher.group(2); TreeItem item = new TreeItem(parent, SWT.NULL); item.setText(name); item.setData(KEY_ADD_DATE, addDate); item.setImage(iconFolder); parent = item; } } else if (line.startsWith(urlLinePrefix)) { Matcher matcher = urlPattern.matcher(line); if (matcher.find()) { Bookmark bookmark = new Bookmark(); bookmark.href = matcher.group(1); bookmark.addDate = matcher.group(2); bookmark.lastVisited = matcher.group(3); bookmark.lastModified = matcher.group(4); bookmark.name = matcher.group(5); TreeItem item = new TreeItem(parent, SWT.NULL); item.setText(bookmark.name); item.setData(bookmark); item.setImage(iconURL); } } else if (line.equals("</DL><p>")) { // folder boundry. parent = parent.getParentItem(); } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void setStatus(String message) { label.setText(message); } public static void main(String[] args) { new BookmarkOrganizer(); } }
BookmarkTransfer.java
package swt_jface.demo11; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import org.eclipse.swt.dnd.ByteArrayTransfer; import org.eclipse.swt.dnd.TransferData; public class BookmarkTransfer extends ByteArrayTransfer { private static final String BOOKMARK_TRANSFER_NAME = "BOOKMARK"; private static final int BOOKMARK_TRANSFER_ID = registerType(BOOKMARK_TRANSFER_NAME); private static final BookmarkTransfer instance = new BookmarkTransfer(); public static BookmarkTransfer getInstance() { return instance; } protected int[] getTypeIds() { return new int[] { BOOKMARK_TRANSFER_ID }; } protected String[] getTypeNames() { return new String[] { BOOKMARK_TRANSFER_NAME }; } protected void javaToNative(Object object, TransferData transferData) { if (object == null || !(object instanceof Bookmark)) return; Bookmark bookmark = (Bookmark) object; if (isSupportedType(transferData)) { try { ByteArrayOutputStream stream = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(stream); out.writeUTF(bookmark.name); out.writeUTF(bookmark.href); out.writeUTF(bookmark.addDate); out.writeUTF(bookmark.lastVisited); out.writeUTF(bookmark.lastModified); out.close(); super.javaToNative(stream.toByteArray(), transferData); } catch (IOException e) { e.printStackTrace(); } } } protected Object nativeToJava(TransferData transferData) { if (isSupportedType(transferData)) { byte[] raw = (byte[]) super.nativeToJava(transferData); if (raw == null) return null; Bookmark bookmark = new Bookmark(); try { ByteArrayInputStream stream = new ByteArrayInputStream(raw); DataInputStream in = new DataInputStream(stream); bookmark.name = in.readUTF(); bookmark.href = in.readUTF(); bookmark.addDate = in.readUTF(); bookmark.lastVisited = in.readUTF(); bookmark.lastModified = in.readUTF(); in.close(); } catch (IOException e) { e.printStackTrace(); return null; } return bookmark; } else { return null; } } }
mybookmark.htm
<!DOCTYPE NETSCAPE-Bookmark-file-1> <!-- This is an automatically generated file. It will be read and overwritten. Do Not Edit! --> <TITLE>Bookmarks</TITLE> <H1>Bookmarks</H1> <DL><p> <DT><H3 FOLDED ADD_DATE="1045476466">c++</H3> <DL><p> <DT><H3 FOLDED ADD_DATE="1046501502">Borland</H3> <DL><p> <DT><A HREF="http://www.hobbypages.net/" mce_HREF="http://www.hobbypages.net/" ADD_DATE="1047352392" LAST_VISIT="1083070035" LAST_MODIFIED="1047352393">C++ Builder Hobbypages - Home Page</A> <DT><A HREF="http://www.ccrun.com/" mce_HREF="http://www.ccrun.com/" ADD_DATE="1046852543" LAST_VISIT="1083070035" LAST_MODIFIED="1046852544">C++ Builder ??</A> <DT><A HREF="http://www.programmersheaven.com/zone3/mh187.htm" mce_HREF="http://www.programmersheaven.com/zone3/mh187.htm" ADD_DATE="1047352196" LAST_VISIT="1083070035" LAST_MODIFIED="1047352196">Programmers Heaven - C - C++ Zone - Components</A> <DT><A HREF="http://www.cnread.net/cnread1/dnwl/cxsj/c/bcbu/toc.htm" mce_HREF="http://www.cnread.net/cnread1/dnwl/cxsj/c/bcbu/toc.htm" ADD_DATE="1046501504" LAST_VISIT="1083070035" LAST_MODIFIED="1046501504">TOC -- Charlie Calvert's C++ Builder Unleashed</A> <DT><A HREF="http://www.cnread.net/cnread1/dnwl/cxsj/c/bcb/index.html" mce_HREF="http://www.cnread.net/cnread1/dnwl/cxsj/c/bcb/index.html" ADD_DATE="1046501522" LAST_VISIT="1083070035" LAST_MODIFIED="1046501522">????????--Borland C++ Builder(??)</A> </DL><p> <DT><H3 FOLDED ADD_DATE="1045886171">Library</H3> <DL><p> <DT><H3 FOLDED ADD_DATE="1047352053">PDF</H3> <DL><p> <DT><A HREF="http://www.fastio.com/" mce_HREF="http://www.fastio.com/" ADD_DATE="1047352072" LAST_VISIT="1083070035" LAST_MODIFIED="1047352072">ClibPDF - FastIO Systems Home Page</A> <DT><A HREF="http://www.fastio.com/" mce_HREF="http://www.fastio.com/" ADD_DATE="1047352055" LAST_VISIT="1083070035" LAST_MODIFIED="1047352056">FastIO Systems Home Page</A> </DL><p> <DT><A HREF="http://www.boost.org/" mce_HREF="http://www.boost.org/" ADD_DATE="1045892008" LAST_VISIT="1083070035" LAST_MODIFIED="1045892009">Boost C++ Libraries</A> <DT><A HREF="http://www.gnu.org/software/commonc++/#TOCadditional" mce_HREF="http://www.gnu.org/software/commonc++/#TOCadditional" ADD_DATE="1045886173" LAST_VISIT="1083070035" LAST_MODIFIED="1045886174">GNU Common C++ - GNU Package - Open Source Telecom (OST)</A> <DT><A HREF="http://osalp.sourceforge.net/" mce_HREF="http://osalp.sourceforge.net/" ADD_DATE="1045890264" LAST_VISIT="1083070035" LAST_MODIFIED="1045890266">Open Source Audio Library Project</A> <DT><A HREF="http://www.oonumerics.org/oon/#libraries" mce_HREF="http://www.oonumerics.org/oon/#libraries" ADD_DATE="1045890219" LAST_VISIT="1083070035" LAST_MODIFIED="1045890220">The Object-Oriented Numerics Page</A> <DT><A HREF="http://www.buddydog.org/C++Builder/c++builder.html" mce_HREF="http://www.buddydog.org/C++Builder/c++builder.html" ADD_DATE="1047260400" LAST_VISIT="1083070035" LAST_MODIFIED="1047260401">Working with C++Builder</A> </DL><p> <DT><H3 FOLDED ADD_DATE="1047479244">Winsock</H3> <DL><p> <DT><A HREF="http://www.cic.tsinghua.edu.cn/sys/book2/" mce_HREF="http://www.cic.tsinghua.edu.cn/sys/book2/" ADD_DATE="1047479245" LAST_VISIT="1083070035" LAST_MODIFIED="1047479254">Untitled Document</A> </DL><p> <DT><A HREF="http://homelf.kimo.com.tw/bruce0829/" mce_HREF="http://homelf.kimo.com.tw/bruce0829/" ADD_DATE="1045644670" LAST_VISIT="1083070035" LAST_MODIFIED="1045644670">C++ Builder ????</A> <DT><A HREF="http://cpp.ittoolbox.com/documents/document.asp?i=1912" mce_HREF="http://cpp.ittoolbox.com/documents/document.asp?i=1912" ADD_DATE="1045644510" LAST_VISIT="1083070035" LAST_MODIFIED="1045644511">C++ Knowledge Base</A> <DT><A HREF="http://www.cplusplus.com/doc/tutorial/" mce_HREF="http://www.cplusplus.com/doc/tutorial/" ADD_DATE="1045644347" LAST_VISIT="1083070035" LAST_MODIFIED="1045644348">C++ language tutorial</A> <DT><A HREF="http://www.cs.wustl.edu/~schmidt/C++/" mce_HREF="http://www.cs.wustl.edu/~schmidt/C++/" ADD_DATE="1045642729" LAST_VISIT="1083070035" LAST_MODIFIED="1045642729">C++ Programming Language Tutorials</A> <DT><A HREF="http://salsa.cit.cornell.edu/cs213-sp01/lectures.html" mce_HREF="http://salsa.cit.cornell.edu/cs213-sp01/lectures.html" ADD_DATE="1045643165" LAST_VISIT="1083070035" LAST_MODIFIED="1045643166">CS 213 Notes from Lectures - C++ Programing</A> <DT><A HREF="http://www.dinkumware.com/htm_cpl/index.html" mce_HREF="http://www.dinkumware.com/htm_cpl/index.html" ADD_DATE="1045642810" LAST_VISIT="1083070035" LAST_MODIFIED="1045642813">Dinkum C++ Library</A> <DT><A HREF="http://www.gnu.org/software/gcc/gcc.html" mce_HREF="http://www.gnu.org/software/gcc/gcc.html" ADD_DATE="1045476468" LAST_VISIT="1083070035" LAST_MODIFIED="1045476618">GCC Home Page - GNU Project - Free Software Foundation (FSF)</A> <DT><A HREF="http://www.programmersheaven.com/zone3/articles/article168.htm" mce_HREF="http://www.programmersheaven.com/zone3/articles/article168.htm" ADD_DATE="1046421401" LAST_VISIT="1083070035" LAST_MODIFIED="1046421403">Programmers Heaven - C - C++ Zone - Sourcecode Articles</A> </DL><p> <DT><H3 FOLDED ADD_DATE="1047199807">Database</H3> <DL><p> <DT><A HREF="http://firebird.sourceforge.net/index.php?op=guide" mce_HREF="http://firebird.sourceforge.net/index.php?op=guide" ADD_DATE="1047199809" LAST_VISIT="1083069989" LAST_MODIFIED="1047199810">Firebird - Relational Database for the New Millennium</A> </DL><p> <DT><H3 FOLDED ADD_DATE="1047025683">Email</H3> <DL><p> <DT><A HREF="http://james.apache.org/index.html" mce_HREF="http://james.apache.org/index.html" ADD_DATE="1047025685" LAST_VISIT="1083070035" LAST_MODIFIED="1047025686">Apache James - Overview - Java Mail and News server, SMTP POP3 NNTP</A> <DT><A HREF="http://www.codeproject.com/internet/DNSQuery.asp" mce_HREF="http://www.codeproject.com/internet/DNSQuery.asp" ADD_DATE="1047038468" LAST_VISIT="1083070035" LAST_MODIFIED="1047038472">The Code Project - Getting an MX record (the easy way) - Internet & Network</A> </DL><p> <DT><H3 FOLDED ADD_DATE="1046588212">Entertainment</H3> <DL><p> <DT><H3 FOLDED ADD_DATE="1046588215">Music</H3> <DL><p> <DT><A HREF="http://app.tvb.com/music/lyrics/lyrics.asp" mce_HREF="http://app.tvb.com/music/lyrics/lyrics.asp" ADD_DATE="1046588216" LAST_VISIT="1083070035" LAST_MODIFIED="1046588217">MusicChannelLyricsGallery ???</A> </DL><p> </DL><p> <DT><H3 FOLDED ADD_DATE="1044516219">Java</H3> <DL><p> <DT><H3 FOLDED ADD_DATE="1047199797">Database</H3> <DL><p> </DL><p> <DT><H3 FOLDED ADD_DATE="1044516223">J2ME</H3> <DL><p> <DT><A HREF="file:///C:/WTK104/docs/api/index.html" mce_HREF="file:///C:/WTK104/docs/api/index.html" ADD_DATE="1045054100" LAST_VISIT="1083070035" LAST_MODIFIED="1045054100">J2ME</A> <DT><A HREF="http://java.sun.com/products/j2mewtoolkit/" mce_HREF="http://java.sun.com/products/j2mewtoolkit/" ADD_DATE="1044516259" LAST_VISIT="1083070035" LAST_MODIFIED="1044516260">Java(TM) 2 Platform Micro Edition, Wireless Toolkit</A> <DT><A HREF="http://www.javamasters.org/" mce_HREF="http://www.javamasters.org/" ADD_DATE="1044516226" LAST_VISIT="1083070035" LAST_MODIFIED="1044516227">JavaMasters - Tools & Specs</A> </DL><p> <DT><A HREF="http://javaalmanac.com/egs/index.html" mce_HREF="http://javaalmanac.com/egs/index.html" ADD_DATE="1045818650" LAST_VISIT="1083069965" LAST_MODIFIED="1045818651">Examples from The Java Developers Almanac 1.4</A> <DT><A HREF="http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html" mce_HREF="http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html" ADD_DATE="1045048972" LAST_VISIT="1083069965" LAST_MODIFIED="1045048972">Java Specification</A> <DT><A HREF="file:///F:/jdk/docs/api/index.html" mce_HREF="file:///F:/jdk/docs/api/index.html" ADD_DATE="1044418573" LAST_VISIT="1083069965" LAST_MODIFIED="1044418573">Overview (Java 2 Platform SE v1.4.0)</A> </DL><p> <DT><H3 FOLDED ADD_DATE="1044255994">Latex</H3> <DL><p> <DT><H3 FOLDED ADD_DATE="1045392982">Tex</H3> <DL><p> </DL><p> <DT><A HREF="http://www.nag.co.uk/projects/OpenMath.html" mce_HREF="http://www.nag.co.uk/projects/OpenMath.html" ADD_DATE="1044255996" LAST_VISIT="1083069962" LAST_MODIFIED="1044255996">The OpenMath Esprit Project</A> </DL><p> <DT><H3 FOLDED ADD_DATE="1043926630">Links</H3> <DL><p> <DT><A HREF="http://www.microsoft.com/isapi/redir.dll?prd=ie&pver=6&ar=CLinks" mce_HREF="http://www.microsoft.com/isapi/redir.dll?prd=ie&pver=6&ar=CLinks" ADD_DATE="1043926630" LAST_VISIT="1083069959" LAST_MODIFIED="1045286381">Customize Links</A> <DT><A HREF="http://www.microsoft.com/isapi/redir.dll?prd=ie&ar=hotmail" mce_HREF="http://www.microsoft.com/isapi/redir.dll?prd=ie&ar=hotmail" ADD_DATE="1043926630" LAST_VISIT="1083069959" LAST_MODIFIED="1045286381">Free Hotmail</A> <DT><A HREF="http://www.microsoft.com/isapi/redir.dll?prd=ie&ar=windowsmedia" mce_HREF="http://www.microsoft.com/isapi/redir.dll?prd=ie&ar=windowsmedia" ADD_DATE="1043926630" LAST_VISIT="1083069959" LAST_MODIFIED="1045286381">Windows Media</A> <DT><A HREF="http://www.microsoft.com/isapi/redir.dll?prd=ie&ar=windows" mce_HREF="http://www.microsoft.com/isapi/redir.dll?prd=ie&ar=windows" ADD_DATE="1043926630" LAST_VISIT="1083069959" LAST_MODIFIED="1045286381">Windows</A> </DL><p> <DT><A HREF="http://61.177.20.218:88/music/movie1/" mce_HREF="http://61.177.20.218:88/music/movie1/" ADD_DATE="1051443185" LAST_VISIT="1083069951" LAST_MODIFIED="1051443189">Index of -music-movie1-</A> <DT><A HREF="http://www.msdn.microsoft.com/" mce_HREF="http://www.msdn.microsoft.com/" ADD_DATE="1047618221" LAST_VISIT="1083069951" LAST_MODIFIED="1047618222">MSDN Home</A> </DL><p>
相关文章推荐
- SWT JFace Bookmark 制作
- SWT(JFace)小制作:简易浏览器
- SWT(JFace)小制作:文本编辑器
- SWT(JFace)小制作:文本阅读器
- SWT(JFace)小制作 FileBrowser文件浏览
- SWT(JFace)小制作:BugTracker
- SWT(JFace) 简易浏览器 制作实现代码第1/2页
- SWT(JFace)小制作:FileBrowser
- SWT(JFace)小制作:选择器,对话框
- SWT(JFace)小制作:图片浏览器
- SWT(JFace)小制作:Wizard(Eclipse插件编程必备)
- SWT(JFace)小制作 BugTracker
- SWT(JFace)小制作:FTP客户端实现
- swt/jface 自定义 Dialog
- java在线聊天项目 使用SWT快速制作登录窗口,可视化窗口Design 更换窗口默认皮肤(切换Swing自带的几种皮肤如矩形带圆角)
- SWT 和 JFace, 第 2 部分: 简介
- 步入SWT/JFace世界,你还等什么?
- SWT/JFace一些经典技术与算法
- SWT/JFace一些经典技术与算法
- JFace和SWT有什么区别