Swt Jface TreeViewer Selection

在使用TreeViewer 構建一個文件瀏覽器時,有個需求是當在某種情況下selection是不需要選中的,當時立馬想到的是
treeViewer.setSelection(null);

然而在設置之後發現並未起作用,

在實例化TreeViewer的時候默認Style爲SWT.SINGLE,此時TreeViewer會默認選中第一項Node的,所以當你設置了爲空後還是沒有起作用。

如果我們想要打開這個文件瀏覽器面板時不選中,則可以在

treeViewer.addSelectionChangedListener(new ISelectionChangedListener(){
			public void selectionChanged(SelectionChangedEvent event) {
                           treeViewer.setSelection(StructuredSelection.EMPTY);	
			}
		});

當TreeViewer的Style爲SWT.MULT時則不會出現默認選項

附測試代碼:

import java.io.File;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Dialog;
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.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.jface.resource.ImageRegistry;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
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.widgets.Combo;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;


public class FileBrowserDialog extends Dialog{
	private Display display;
	private Shell shell;
	private Text fileNameText;
	private File file;
	private TreeViewer treeViewer;
	private ISelection selection;
	public Object result;
	private ImageRegistry imageRegistry; 
	private Image iconFolder = new Image(Display.getDefault(), "D:/素材/iphone.gif"); 
	private Image iconFile = new Image(Display.getDefault(), "D:/素材/android.gif");
	private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
	 
	public FileBrowserDialog(Shell parent, int style) {
		super(parent, style);
	}
	
	public Object open() {
		display = getParent().getDisplay();
		createContents();
		shell.open();
		shell.layout();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
		return result;
	}
	private void createContents() {
		shell = new Shell(getParent(), getStyle() | SWT.CLOSE | SWT.RESIZE |  SWT.APPLICATION_MODAL);
		shell.setSize(575, 496);
		GridLayout gl_shell = new GridLayout();
		gl_shell.numColumns = 2;
		shell.setLayout(gl_shell);
		
		Section sctnNewSection = formToolkit.createSection(shell,  Section.TITLE_BAR);
		sctnNewSection.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, false, 1, 1));
		formToolkit.paintBordersFor(sctnNewSection);
		sctnNewSection.setText("工作目錄");

		treeViewer = new TreeViewer(shell, SWT.BORDER); 
		GridData gridData = new GridData(GridData.FILL_BOTH);
		gridData.widthHint = 408;
		gridData.heightHint = 219;
		treeViewer.getTree().setLayoutData(gridData); 
		
		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("保存: " + 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("D:\\素材"));
		treeViewer.addFilter(new ViewerFilter() {
			public boolean select(Viewer viewer, Object parentElement, Object element) {
				File file = (File) element;
				if(file.getName().endsWith(".jpg") || file.isDirectory()) {
					return true;
				}
				return false;
			}
		});
		
		sctnNewSection.addListener(SWT.Activate, new Listener() {
			public void handleEvent(Event e) {
				treeViewer.collapseAll();
				treeViewer.setSelection(StructuredSelection.EMPTY);
				treeViewer.setSelection(null);
			}
		});
		
		//treeViewer.setSelection(StructuredSelection.EMPTY);
		//treeViewer.setSelection(null);
		//selection = new StructuredSelection(new File("D:\\素材\\圖片\\1.jpg"));
		//treeViewer.setSelection(selection);
		treeViewer.addSelectionChangedListener(new ISelectionChangedListener(){
			public void selectionChanged(SelectionChangedEvent event) {
				selection = treeViewer.getSelection();
				if(file != null) {
					file = (File) ((StructuredSelection)selection).getFirstElement();
					if(file.isFile()) {
						fileNameText.setText(file.getName());
					}
				}
			}
		});
		new Label(shell, SWT.NONE);
	
		Composite composite = new Composite(shell, SWT.NONE);
		GridData gd_composite = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
		gd_composite.widthHint = 438;
		composite.setLayoutData(gd_composite);
		composite.setBounds(200, 200, 200, 30);
		composite.setLayout(new GridLayout(9, false));
		new Label(composite, SWT.NONE);
		new Label(composite, SWT.NONE);
		Label label = new Label(composite, SWT.NONE);
		label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 3, 1));
		label.setText("文件名 :");
		
		fileNameText = new Text(composite, SWT.BORDER);
		
		GridData gd_text_1 = new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1);
		gd_text_1.widthHint = 255;
		fileNameText.setLayoutData(gd_text_1);
		
		Button btnNewButton = new Button(composite, SWT.NONE);
		btnNewButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
		btnNewButton.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				
			}
		});
		btnNewButton.setText("保存");
		new Label(composite, SWT.NONE);
		new Label(composite, SWT.NONE);
		
		Label label_1 = new Label(composite, SWT.NONE);
		label_1.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 3, 1));
		label_1.setText("文件類型 :");
		
		Combo combo = new Combo(composite, SWT.NONE);
		combo.setEnabled(false);
		combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
		combo.setText("xxxxxxxxxx");
		
		Button btnNewButton_1 = new Button(composite, SWT.NONE);
		GridData gd_btnNewButton_1 = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
		gd_btnNewButton_1.widthHint = 37;
		btnNewButton_1.setLayoutData(gd_btnNewButton_1);
		btnNewButton_1.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				file = null;
				shell.dispose();
			}
		});
		btnNewButton_1.setText("取消");
	}
	
	public static void main(String[] args) {
		FileBrowserDialog dialog = new FileBrowserDialog(new Shell(), SWT.None);
		dialog.open();	
	}
	
	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;
	}
}





發佈了68 篇原創文章 · 獲贊 16 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章