当前位置: 首页 > 面试题库 >

如何在Eclipse插件中更新/刷新视图?

鲜于温书
2023-03-14
问题内容

我有一个具有单个 视图*Eclipse插件 (例如eclipse helloworld-view-plugin-
project)。在视图文件中 ,我想更新视图时 得到一个 事件
***

在此视图中,我在一个具有多个标签的组中有一个GridData。我有几个 注册到程序的服务,其状态应 在此GridData中显示。

编辑:为了更好地显示我的问题,我更新了这篇文章,并添加了整个代码:

CreatePartControl():

public void createPartControl(Composite _parent) {
  parent = _parent;
  createContents();
  addBindings();
  makeActions();
  contributeToActionBars();
}

CreateContents():

protected void createContents() {

  // fixed
  checkIcon = //...
  errorIcon = //...
  smallFont = SWTResourceManager.getFont("Segoe UI", 7, SWT.NORMAL);

  // content
  gl_shell = new GridLayout(1, false);
  //margins, etc. for gl_shell
  parent.setLayout(gl_shell);

  final Label lblGreeting = new Label(parent, SWT.NONE);
  lblGreeting.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
  lblGreeting.setText("Hi " + Preferences.getPreName());

  // -- GROUP YOUR STATS (show all services)
  createStatusGroupBox();
}

createStatusGroupBox():

private Group grpYourStatus = null; // outside the method for access in listener (below)

private void createStatusGroupBox() {
  grpYourStatus = new Group(parent, SWT.NONE);
  grpYourStatus.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
  grpYourStatus.setText("Your upload status");
  grpYourStatus.setLayout(new GridLayout(3, false));

  // add message if no service is registered
  if ( r.getServiceList().size() == 0 ) {
     Label status = new Label(grpYourStatus, SWT.NONE);
     status.setText("No service registered.");
     new Label(grpYourStatus, SWT.NONE); //empty
     new Label(grpYourStatus, SWT.NONE); //empty
  }

  // add labels (status, message, name) for each registered service
  for ( IRecorderObject service : r.getServiceList() ) {
     Label name = new Label(grpYourStatus, SWT.NONE);
     Label status = new Label(grpYourStatus, SWT.NONE);
     Label message = new Label(grpYourStatus, SWT.NONE);
     message.setFont(smallFont);
     message.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));

     service.getServiceViewItem().setLabelsAndIcons(name, status, message, checkIcon, errorIcon); //this also sets the values of the labels (label.setText(...) via data binding)
}

不幸的是,我不知道更新/重置它的正确方法是什么。我尝试了以下方法:

侦听器(应更新视图/服务列表):

r.addPropertyChangeListener(BindingNames.SERVICE_ADDED, new PropertyChangeListener() {
  public void propertyChange(final PropertyChangeEvent evt) {   
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
        // This "redraws" the view, but just places the whole content (generated in createStatusGroupBox()) above the other parts.
        //Display.getCurrent().update();
        //createStatusGroupBox();
        //parent.layout(true);
        //parent.redraw();

        // disposes grpYourStatus-Group but doesn't show anything then
        grpYourStatus.dispose();
        createStatusGroupBox();
        grpYourStatus.layout();
        grpYourStatus.redraw(); 
      }
    });
  }
});

我还尝试了以下语句(分别);都没有成功:

parent.redraw();
parent.update();
parent.layout();
parent.layout(true);
parent.refresh();

在这篇文章中,我阅读以下内容:

createPartControls是视图生命周期的时间,将在其中创建其包含的小部件(当视图最初可见时)。该代码在视图生命周期中仅执行一次,因此您不能在此处直接添加任何内容来刷新视图。

Eclipse部件通常会更新其内容,以响应工作台内部更改的选择(例如,用户可能在调试视图中单击另一个堆栈框架)。

不幸的是,我不知道该怎么办,搜索没有任何帮助… 谢谢您的帮助和建议


问题答案:

我终于找到了答案(连同AndreiC的帮助!):

我的听众现在看起来像这样:

r.addPropertyChangeListener(BindingNames.SERVICE_ADDED, new PropertyChangeListener() {
  public void propertyChange(final PropertyChangeEvent evt) {   
    Display.getDefault().asyncExec(new Runnable() {
      public void run() {
         // remove grpYourStatus from parent
         grpYourStatus.dispose();

         // add grpYourStatus (with updated values) to parent
         createStatusGroupBox();

         // refresh view
         parent.pack();
         parent.layout(true);
      }
    });
  }
});

其余部分与上面的代码相同。



 类似资料:
  • 问题内容: 我基于eclipse插件视图教程创建了一个简单的视图。我添加了一些功能,使我的插件可以侦听调试器上的更改。我的问题是,每次调试器发生问题时,我都希望刷新视图并使用新信息进行更新。这是我所尝试的/正在尝试的: 因此,基本上,我将所有这些侦听侦听逻辑放在顶部,该侦听逻辑发生在if语句内部。我知道我的程序可以进入那里。每次发生重大变化时,我都想刷新视图,并且尝试尝试执行viewer.refr

  • 当我单击一个按钮(刷新页面中的数据,释放缓存)主页时,我想刷新页面我的主页中有一个列表。有一个功能可以更改列表上的项目。但当我更改项目并重定向到主页时,它会显示以前的值,直到刷新页面为止,我只想在按下按钮时刷新(清除主页上的缓存)。控制器处于$状态。go(“应用程序订阅”) 我写了这个。如何更改它?

  • 我已尝试更新我的Eclipse。目前我的Eclipse中只有2.2版Android SDK。昨天我更新了我的Eclipse,如下所示: 蚀- 我在这里发布了一些我从下载和安装得到的信息的最后一行: 准备安装档案下载Android SDK平台-工具,版本12 安装Android SDK平台-工具,版本12 停止ADB服务器成功。 安装Android SDK平台-工具,版本12 下载Android S

  • 我试图更新Eclipse中的一些软件,并且大部分没有问题,但是当我试图更新PyDev(Python插件)时,我得到了这个错误: 我以管理员的身份运行Eclipse,不知道是什么导致了这个问题。 祝好

  • 我正在用android studio构建一个高尔夫记分卡应用程序,但昨晚在我关闭笔记本电脑之前,它构建得很好,今天早上,当我运行Android studio时,我遇到了一个错误:“插件太旧,请更新到更新的版本,或者将Android_DAILY_OVERRIDE环境变量设置为“aed79d567e57792ed352e708d2b7ca891ff897c6”,我的应用程序结构也发生了变化,不再有清单

  • 当前安装的软件:Android Developer Tools 21.0.1.201212060302(com.Android.ide.eclipse.adt.package.product 21.0.1.201212060302) 一次只能安装下列其中之一: 无法满足依赖项: 无法满足依赖项: