Java 更改文件目录后更新JFace treeviewer

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

大家好。目前正在进行一个RCP项目,该项目涉及使用treeviewer(org.eclipse.jface.viewers.treeviewer)在eclipse中显示目录和其中的文件。本质上,树是用一个目录实例化的,比如
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
    }