Java 更改文件目录后更新JFace treeviewer
大家好。目前正在进行一个RCP项目,该项目涉及使用treeviewer(org.eclipse.jface.viewers.treeviewer)在eclipse中显示目录和其中的文件。本质上,树是用一个目录实例化的,比如Java 更改文件目录后更新JFace treeviewer,java,eclipse,Java,Eclipse,大家好。目前正在进行一个RCP项目,该项目涉及使用treeviewer(org.eclipse.jface.viewers.treeviewer)在eclipse中显示目录和其中的文件。本质上,树是用一个目录实例化的,比如private String folderPath=“C:\\Default”它可以完美地工作。运行应用程序后,它会完美地显示初始目录及其内容。请参阅运行RCP后treeviewer的图像: 问题是当使用DirectoryDialog对象更新folderpath时,treev
private String folderPath=“C:\\Default”代码>它可以完美地工作。运行应用程序后,它会完美地显示初始目录及其内容。请参阅运行RCP后treeviewer的图像:
问题是当使用DirectoryDialog对象更新folderpath时,treeviewer保持不变
我发现在运行应用程序时很难使用新值folderpath重新初始化树
代码附在这里
公共类SampleTreeView扩展了ViewPart{
私有字符串folderPath=“C:\\Default”;
私人TreeViewer电视台;
公共样本树视图(){
超级();
}
公共字符串getFolderPath(){
返回folderPath;
}
公共void setFolderPath(字符串项目路径){
this.folderPath=项目路径;
}
公共void createPartControl(复合父级){
复合材料=新复合材料(母体,SWT.NONE);
setLayout(新的GridLayout(1,false));
//添加复选框以切换标签是否保留大小写
按钮保存盒=新按钮(组合,SWT.检查);
setText(“&Preserve case”);
按钮刷新BTN=新按钮(复合、SWT.PUSH);
刷新btn.setText(“刷新”);
//为选择事件注册侦听器
refreshBtn.addSelectionListener(新的SelectionAdapter(){
@凌驾
公共无效WidgeSelected(SelectionEvent e){
电视。刷新();
}
});
tv=新TreeViewer(复合);
getSite().setSelectionProvider(电视);
tv.getTree().setLayoutData(新的GridData(GridData.FILL_BOTH));
setContentProvider(新的FileTreeContentProvider());
tv.setLabelProvider(新的FileTreeLabelProvider());
设置输入(“根”);
preserveCase.addSelectionListener(新的SelectionAdapter(){
公共无效widgetSelected(SelectionEvent事件){
boolean preserveCase=((按钮)event.widget).getSelection();
FileTreeLabelProvider ftlp=(FileTreeLabelProvider)电视
.getLabelProvider();
ftlp.setPreserveCase(preserveCase);
}
});
}
public void setFocus(){
tv.getControl().setFocus();
}
类FileTreeContentProvider实现ITreeContentProvider{
SampleTreeView stv=新的SampleTreeView();
文件源=新文件(stv.getFolderPath());
公共对象[]获取子对象(对象arg0){
返回((文件)arg0.listFiles();
}
公共对象getParent(对象arg0){
返回((文件)arg0.getParentFile();
}
公共布尔子对象(对象arg0){
Object[]obj=getChildren(arg0);
返回obj==null?false:obj.length>0;
}
公共对象[]getElements(对象arg0){
返回source.listFiles();
}
公共空间处置(){
}
public void inputChanged(查看器arg0、对象arg1、对象arg2){
}
}
类FileTreeLabelProvider实现ILabelProvider{
私人名单听众;
布尔保持情形;
公共文件TreeLabelProvider(){
侦听器=新的ArrayList();
}
public void setPreserveCase(布尔值preserveCase){
this.preserveCase=preserveCase;
LabelProviderChangedEvent=新的LabelProviderChangedEvent(此);
for(int i=0,n=listeners.size();i
您希望我们查看的代码必须包含在问题中,而不是链接中。好的。将立即更新。谢谢您为什么要在内容提供商中执行新SampleTreeView()
?这将创建与实际视图无关的视图的新实例。在我看来,您需要返回并阅读一些教程,了解内容提供商如何使用setInput
和getElements
。感谢您的时间和提示greg-449。所做的更改。任何有用的代码片段或链接,特别是与我看到的问题、访问setInput等相关的内容,都将不胜感激。事实证明,没有必要直接将folderpath
传递给内容提供商来解决@greg-449问题。首先,我必须在Messages.java
和message.properties
中为相关插件设置folderpath
。目录对话框更新Messages.java
中的folderpath
条目。刷新按钮重置treeviewer以构建新目录,从而解决问题。希望这对未来的人们有所帮助。
public class SampleTreeView extends ViewPart {
private String folderPath = "C:\\Default";
private TreeViewer tv;
public SampleTreeView() {
super();
}
public String getFolderPath() {
return folderPath;
}
public void setFolderPath(String projectPath) {
this.folderPath = projectPath;
}
public void createPartControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(1, false));
// Add a check box to toggle whether the labels preserve case
Button preserveCase = new Button(composite, SWT.CHECK);
preserveCase.setText("&Preserve case");
Button refreshBtn = new Button(composite, SWT.PUSH);
refreshBtn.setText("Refresh");
//register listener for the selection event
refreshBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
tv.refresh();
}
});
tv = new TreeViewer(composite);
getSite().setSelectionProvider(tv);
tv.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
tv.setContentProvider(new FileTreeContentProvider());
tv.setLabelProvider(new FileTreeLabelProvider());
tv.setInput("root");
preserveCase.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
boolean preserveCase = ((Button) event.widget).getSelection();
FileTreeLabelProvider ftlp = (FileTreeLabelProvider) tv
.getLabelProvider();
ftlp.setPreserveCase(preserveCase);
}
});
}
public void setFocus() {
tv.getControl().setFocus();
}
class FileTreeContentProvider implements ITreeContentProvider {
SampleTreeView stv = new SampleTreeView();
File source = new File(stv.getFolderPath());
public Object[] getChildren(Object arg0) {
return ((File) arg0).listFiles();
}
public Object getParent(Object arg0) {
return ((File) arg0).getParentFile();
}
public boolean hasChildren(Object arg0) {
Object[] obj = getChildren(arg0);
return obj == null ? false : obj.length > 0;
}
public Object[] getElements(Object arg0) {
return source.listFiles();
}
public void dispose() {
}
public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
}
}
class FileTreeLabelProvider implements ILabelProvider {
private List listeners;
boolean preserveCase;
public FileTreeLabelProvider() {
listeners = new ArrayList();
}
public void setPreserveCase(boolean preserveCase) {
this.preserveCase = preserveCase;
LabelProviderChangedEvent event = new LabelProviderChangedEvent(this);
for (int i = 0, n = listeners.size(); i < n; i++) {
ILabelProviderListener ilpl = (ILabelProviderListener) listeners
.get(i);
ilpl.labelProviderChanged(event);
}
}
public Image getImage(Object obj) {
String imageKey = ISharedImages.IMG_OBJ_FILE;
if (((File) obj).isDirectory())
imageKey = ISharedImages.IMG_OBJ_FOLDER;
return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
}
public String getText(Object arg0) {
String text = ((File) arg0).getName();
if (text.length() == 0) {
text = ((File) arg0).getPath();
}
return preserveCase ? text : text.toUpperCase();
}
public void addListener(ILabelProviderListener arg0) {
listeners.add(arg0);
}
public void dispose() {
// Dispose the images
if (dir != null)
dir.dispose();
if (file != null)
file.dispose();
}
public boolean isLabelProperty(Object arg0, String arg1) {
return false;
}
public void removeListener(ILabelProviderListener arg0) {
listeners.remove(arg0);
}
} //end of label provider
}