代码如下:复制代码 代码如下:package swt_jface.demo6; import java.io.File; import java.util.Date; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; public class FileBrowser { Display display = new Display(); Shell shell = new Shell(display); Table table; File rootDir; Image iconFolder = new Image(shell.getDisplay(), "C:/icons/folder.gif"); Image iconFile = new Image(shell.getDisplay(), "C:/icons/file.gif"); public FileBrowser() { GridLayout gridLayout = new GridLayout(); shell.setLayout(gridLayout); table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION); //table.setLinesVisible(true); table.setHeaderVisible(true); TableColumn tcFileName = new TableColumn(table, SWT.LEFT); tcFileName.setText("File name"); //tcFileName.setImage(new Image(shell.getDisplay(), "icons/folder.gif")); TableColumn tcFileSize = new TableColumn(table, SWT.RIGHT); tcFileSize.setText("Size"); TableColumn tcDateModified = new TableColumn(table, SWT.RIGHT); tcDateModified.setText("Date Modified"); tcFileName.setWidth(200); tcFileSize.setWidth(80); tcDateModified.setWidth(180); TableItem item = new TableItem(table, SWT.NULL); item.setText(new String[]{"Name", "Size"}); table.setLayoutData(new GridData(GridData.FILL_BOTH)); table.pack(); shell.pack(); shell.open(); setRootDirectory(new File(".")); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } private void setRootDirectory(File dir) { this.rootDir = dir; if(! (dir.exists() && dir.isDirectory())) throw new IllegalArgumentException("Invalid directory. "); table.removeAll(); File[] files = dir.listFiles(); for(int i=0; files != null && i < files.length; i++) { File file = files[i]; TableItem item = new TableItem(table, SWT.NULL); item.setBackground(i % 2 == 0 ? shell.getDisplay().getSystemColor(SWT.COLOR_WHITE) : shell.getDisplay().getSystemColor(SWT.COLOR_GRAY)); 编程客栈item.setText(0, file.getName()); item.setText(2, new Date(file.lastModified()).toString()); if(file.isDirectory()) { item.setImage(0, iconFolder); }else{ int lastDot = file.getName().lastIndexOf('.'); if(lastDot >= 0 && lastDot < file.getName().length()) { item.setImage(0, getIcon(file.getName().substring(lastDot+1))); } long kbytes = file.length() / 1024; if(kbytes == 0) kbytes = 1; item.setText(1, kbytes + " KB"); } } } private ImageRegistry imageRegistry; public Image getIcon(String extension) { if(imageRegistry == null) imageRegistry = new ImageRegistry(); Image image = imageRegistry.get(extension); if(image != null) return image; Program program = Program.findProgram(extension); if(program != null) { image = new Image(shell.getDisplay(), program.getImageData()); imageRegistry.put(extension, image); }else{ image = iconFile; } return image; } public static void main(String[] args) { new FileBrowser(); } }更多的Table操作的例子: 复制代码 代码如下:package swt_jface.demo6; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; public class Main { public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final Table table = new Table(shell, SWT.BORDER | SWT.MULTI); table.setLinesVisible(true); for (int i = 0; i < 3; i++) { TableColumn column = new TableColumn(table, SWT.NONE); column.setWidth(100); } for (int i = 0; i < 3; i++) { TableItem item = new TableItem(table, SWT.NONE); item.setText(new String[] { "" + i, "" + i, "" + i }); } final TableEditor editor = new TableEditor(table); editor.horizontalAlignment = SWT.LEFT; editor.grabHorizontal = true; table.addListener(SWT.MouseDown, new Listener() { public void handleEvent(Event event) { Rectangle clientArea = table.getClientArea(); Point pt = new Point(event.x, event.y); int index = table.getTopIndex(); while (index < table.getItemCount()) { boolean visible = false; final TableItem item = table.getItem(index); for (int i = 0; i < table.getColumnCount(); i++) { Rectangle rect = item.getBounds(i); if (rect.contains(pt)) { final int column = i; final Text text = new Text(table, SWT.NONE); Listener textListener = new Listener() { public void handleEvent(final Event e) { switch (e.type) { case SWT.FocusOut: item.setText(column, text.getText()); text.dispose(); break; case SWT.Traverse: switch (e.detail) { case SWT.TRAVERSE_RETURN: item.setText(column, text.getText()); case SWT.TRAVERS开发者_Python培训E_ESCAPE: text.dispose(); e.doit = false; } break; } } }; text.addListener(SWT.FocusOut, textListener); text.addListener(SWT.Traverse, textListener); editor.setEditor(text, item, i); text.setText(item.getText(i)); text.selectAll(); text.setFocus(); return; } if (!visible && rect.intersects(clientArea)) { visible = true; } } if (!visible) return; index++; } } }); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } }下面的代码是对FileBrowser功能的增强: 实现1: FileBrowser.java 复制代码 代码如下:package swt_jface.demo7; import java.io.File; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TreeEditor; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.events.TreeEvent; import org.eclipse.swt.events.TreeListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; public class FileBrowser { Display display = new Display(); Shell shell = new Shell(display); Tree tree; File rootDir; public FileBrowser() { Action actionSetRootDir = new Action("Set Root Dir") { public void run() { DirectoryDialog dialog = new DirectoryDialog(shell); String path = dialog.open(); if (path != null) { setRootDir(new File(path)); } } }; ToolBar toolBar = new ToolBar(shell, SWT.FLAT); ToolBarManager manager = new ToolBarManager(toolBar); manager.add(actionSetRootDir); manager.update(true); shell.setLayout(new GridLayout()); tree = new Tree(shell, SWT.BORDER); tree.setLayoutData(new GridData(GridData.FILL_BOTH)); setRootDir(new File("C:/temp")); tree.addTreeListener(new TreeListener() { public void treeCollapsed(TreeEvent e) { } public void treeExpanded(TreeEvent e) { TreeItem item = (TreeItem) e.item; TreeItem[] children = item.getItems(); for (int i = 0; i < children.length; i++) if (children[i].getData() == null) children[i].dispose(); else return; File[] files = ((File) item.getData()).listFiles(); for (int i = 0; files != null && i < files.length; i++) addFileToTree(item, files[i]); } }); tree.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { } public void widgetDefaultSelected(SelectionEvent e) { TreeItem item = (TreSTanyeItem) e.item; File file = (File) item.getData(); if (Program.launch(file.getAbsolutePath())) { System.out.println("File has been launched: " + file); } else { System.out.println("Unable to launch file: " + file); } } }); final TreeEditor editor = new TreeEditor(tree); tree.addListener(SWT.MouseDown, new Listener() { public void handleEvent(Event event) { Point point = new Point(event.x, event.y); final TreeItem item = tree.getItem(point); if (item == null) return; final Text text = new Text(tree, SWT.NONE); text.setText(item.getText()); text.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_YELLOW)); editor.horizontalAlignment = SWT.LEFT; editor.grabHorizontal = true; editor.setEditor(text, item); Listener textListener = new Listener() { public void handleEvent(final Event e) { switch (e.type) { case SWT.FocusOut : File renamed = renameFile( (File) item.getData(), text.getText()); if (renamed != null) { item.setText(text.getText()); item.setData(renamed); } text.dispose(); break; case SWT.Traverse : switch (e.detail) { case SWT.TRAVERSE_RETURN : renamed = renameFile( (File) item.getData(), text.getText()); if (renamed != null) { item.setText(text.getText()); item.setData(renamed); } case SWT.TRAVERSE_ESCAPE : text.dispose(); e.doit = false; } break; } } }; text.addListener(SWT.FocusOut, textListener); text.addListener(SWT.Traverse, textListener); text.setFocus(); } }); shell.setSize(400, 260); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } private File renameFile(File file, String newName) { File dest = new File(file.getParentFile(), newName); if (file.renameTo(dest)) { return dest; } else { return null; } } private void setRootDir(File root) { if( (!root.isDirectory()) || (!root.exists())) throw new IllegalArgumentException(http://www.devze.com"Invalid root: " + root); this.rootDir = root; shell.setText("Now browsing: " + root.getAbsolutePath()); if (tree.getItemCount() > 0) { TreeItem[] items = tree.getItems(); for (int i = 0; i < items.length; i++) { items[i].dispose(); } } File[] files = root.listFiles(); for(int i=0; files != null && i < files.length; i++) addFileToTree(tree, files[i]); } private void addFileToTree(Object parent, File file) { TreeItem item = null; if (parent instanceof Tree) item = new TreeItem((Tree) parent, SWT.NULL); else if (parent instanceof TreeItem) item = new TreeItem((TreeItem) parent, SWT.NULL); else throw new IllegalArgumentException( "parent should be a tree or a tree item: " + parent); item.setText(file.getName()); item.setImage(getIcon(file)); item.setData(file); if (file.isDirectory()) { // // recursively adds all the children of this file. // File[] files = file.listFiles(); // for(int i=0; i<files.length; i++) // buildTree(item, files[i]); if (file.list() != null && file.list().length > 0) new TreeItem(item, SWT.NULL); } } private ImageRegistry imageRegistry; Image iconFolder = new Image(shell.getDisplay(), "C:/icons/folder.gif"); Image iconFile = new Image(shell.getDisplay(), "C:/icons/file.gif"); private Image getIcon(File file) { if (file.isDirectory()) return iconFolder; int lastDotPos = file.getName().indexOf('.'); if (lastDotPos == -1) return iconFile; Image image = getIcon(file.getName().substring(lastDotPos + 1)); return image == null ? iconFile : image; } private Image getIcon(String extension) { if (imageRegistry == null) imageRegistry = new ImageRegistry(); Image image = imageRegistry.get(extension); if (image != null) return image; Program program = Program.findProgram(extension); ImageData imageData = (program == null ? null : program.getImageData()); if (imageData != null) { image = new Image(shell.getDisplay(), imageData); imageRegistry.put(extension, image); } else { image = iconFile; } return image; } public static void main(String[] args) { new FileBrowser(); } }实现2: FileBrowserJFace.java 复制代码 代码如下:package swt_jface.demo7; import java.io.File; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolBar; public class FileBrowserJFace { Display display = new Display(); Shell shell = new Shell(display); File rootDir; TreeViewer treeViewer; public FileBrowserJFace() { Action actionSetRootDir = new Action("Set Root Dir") { public void run() { DirectoryDialog dialog = new DirectoryDialog(shell); String path = dialog.open(); if (path != null) { treeViewer.setInput(new File(path)); } } }; final ViewerFilter directoryFilter = new ViewerFilter() { public boolean select( Viewer viewer, Object parentElement, Object element) { return ((File)element).isDirectory(); } }; Action actionShowDirectoriesOnly = new Action("Show directories only") { public void run() { if(! isChecked()) treeViewer.removeFilter(directoryFilter); else treeViewer.addFilter(directoryFilter); } }; actionShowDirectoriesOnly.setChecked(false); Action actionDeleteFile = new Action("Delete th编程客栈e selected file") { public void run() { IStructuredSelection selection = (IStructuredSelection)treeViewer.getSelection(); File file = (File)selection.getFirstElement(); if(file == null) { System.out.println("Please select a file first."); return; } MessageBox messageBox = new MessageBox(shell, SWT.YES | SWT.NO); messageBox.setMessage("Are you sure to delete file: " + file.getName() + "?"); if(messageBox.open() == SWT.YES) { File parentFile = file.getParentFile(); if(file.delete()) { System.out.println("File has been deleted. "); // Notifies the viewer for update. treeViewer.refresh(parentFile, false); }else{ System.out.println("Unable to delete file."); } } } }; ToolBar toolBar = new ToolBar(shell, SWT.FLAT); ToolBarManager manager = new ToolBarManager(toolBar); manager.add(actionSetRootDir); manager.add(actionShowDirectoriesOnly); manager.add(actionDeleteFile); manager.update(true); shell.setLayout(new GridLayout()); treeViewer = new TreeViewer(shell, SWT.BORDER); treeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH)); treeViewer.setContentProvider(new ITreeContentProvider() { public Object[] getChildren(Object parentElement) { File[] files = ((File)parentElement).listFiles(); if(files == null) return new Object[0]; return files; } public Object getParent(Object element) { return ((File)element).getParentFile(); } public boolean hasChildren(Object element) { File file = (File)element; File[] files = file.listFiles(); if(files == null || files.length == 0) return false; return true; } public Object[] getElements(Object inputElement) { File[] files = ((File)inputElement).listFiles(); if(files == null) return new Object[0]; return files; } public void dispose() { } public void inputChanged( Viewer viewer, Object oldInput, Object newInput) { shell.setText("Now browsing: " + newInput); } }); treeViewer.setLabelProvider(new LabelProvider() { public Image getImage(Object element) { return getIcon((File)element); } public String getText(Object element) { return ((File)element).getName(); } }); treeViewer.setSorter(new ViewerSorter() { public int category(Object element) { File file = (File)element; if(file.isDirectory()) return 0; else return 1; } }); treeViewer.setInput(new File("C:/temp")); shell.setSize(400, 260); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } // private File renameFile(File file, String newName) { // File dest = new File(file.getParentFile(), newName); // if (file.renameTo(dest)) { // rehttp://www.devze.comturn dest; // } else { // return null; // } // } private ImageRegistry imageRegistry; Image iconFolder = new Image(shell.getDisplay(), "C:/icons/folder.gif"); Image iconFile = new Image(shell.getDisplay(), "C:/icons/file.gif"); private Image getIcon(File file) { if (file.isDirectory()) return iconFolder; int lastDotPos = file.getName().indexOf('.'); if (lastDotPos == -1) return iconFile; Image image = getIcon(file.getName().substring(lastDotPos + 1)); return image == null ? iconFile : image; } private Image getIcon(String extension) { if (imageRegistry == null) imageRegistry = new ImageRegistry(); Image image = imageRegistry.get(extension); if (image != null) return image; Program program = Program.findProgram(extension); ImageData imageData = (program == null ? null : program.getImageData()); if (imageData != null) { image = new Image(shell.getDisplay(), imageData); imageRegistry.put(extension, image); } else { image = iconFile; } return image; } public static void main(String[] args) { new FileBrowserJFace(); } }
精彩评论