【问题标题】:RCP 4 Toggle a button in the toolbarRCP 4 切换工具栏中的按钮
【发布时间】:2015-01-22 13:26:30
【问题描述】:

我正在尝试执行以下操作:

  1. 在工具栏中创建一个按钮(已作为“已处理的工具项”完成)
  2. 单击按钮并让按钮看起来像是被按下了(我阅读了有关使用 IAction.AS_CHECK_BOX 的内容,但我找不到任何关于如何执行此操作的明确 RCP 4 示例)。当按钮被按下时可以执行某个动作(为了这个例子,我们称之为“动作A”)
  3. 再次单击按钮,使按钮看起来不再被按下。当不再按下按钮时,可以执行不同的操作(“为了本示例,我们将其称为“操作 B”)

一个更具体的例子是文本编辑器程序。假设工具栏有一个“粗体”按钮。用户按下“粗体”按钮,按钮图标现在看起来就像被按下了一样。此时,用户在文本区域中键入的所有内容都将以粗体显示。然后用户再次按下“粗体”按钮,按钮看起来不再像被按下了。此时,用户在文本区域中键入的所有内容都是常规字体。

我尝试过四处搜索,但找不到任何清楚说明如何做到这一点的示例。任何帮助将不胜感激!

【问题讨论】:

    标签: java rcp e4


    【解决方案1】:

    当您将“处理程序工具项”添加到 Application.e4xmi 中的工具栏时,您可以将“类型”指定为“检查”以获取按下/未按下的行为。

    在您的项目处理程序中,您可以注入“MToolItem”,以便您可以测试检查状态:

    @Execute
    public void execute(final MToolItem item)
    {
      if (item.isSelected())
        ... button pressed in
      else
        ... button not pressed
    }
    

    【讨论】:

      【解决方案2】:

      我没有为文本编辑器使用“粗体按钮”,而是为“空白字符画家”实现了一个切换按钮。即一个切换按钮,用于将不可打印的字符显示为空格、制表符或返回。 以下可用于多页文本编辑器。切换按钮仅在先前选择显示不可打印字符的部件/编辑器上激活。

      在 Application.e4xmi 中工具栏的“处理程序工具项”中,将按钮“类型”指定为“检查”,并提供任何 ID =“zzzz.handledtoolitem.whitespacespainter.button” 在处理程序类中注入 MtoolItem 和 EventBroker,因此代理将按钮的状态发送到应用程序的其余部分:

      public class WhiteSpacePainterHandler {
      boolean buttonStatus;
      @Execute
      public void execute(final MToolItem item, IEventBroker broker) {
          if (item.isSelected()){
              buttonStatus = true;
          }
          else{
              buttonStatus = false;
          }
          broker.post("BUTTON_STATUS", buttonStatus); 
      }
      }
      

      在文本编辑器部分

      public class SampleEditorPart {
      private boolean buttonStatus = false;
      public StyledText st = null;
      public TextViewer tv = null;
      @Inject MPart parte;
      @Inject EModelService modelService;
      @Inject MApplication app;
      public WhitespaceCharacterPainter whitespaceCharacterPainter;
      //More code here...
      
      @PostConstruct
      public void postConstruct(Composite parent){
          //...
          tv = new TextViewer(parent,SWT.MULTI | SWT.V_SCROLL );
          st = tv.getTextWidget();
          whitespaceCharacterPainter = new  WhitespaceCharacterPainter(tv);
          //...
      }
      @Inject
      @Optional
      public void updatePartByButton(@UIEventTopic("BUTTON_STATUS") boolean newButtonStatus) {
          final MElementContainer<MUIElement>container = parte.getParent();
          if (parte.equals((MPart)container.getSelectedElement())){
              if(buttonStatus != newButtonStatus)
              {
              buttonStatus = newButtonStatus;
              MToolItem item = (MToolItem) modelService.find("zzzz.handledtoolitem.boton",app);
              item.setSelected(buttonStatus);
              if(buttonStatus){
                  sv.addPainter(whitespaceCharacterPainter);
              }
              else{
                  sv.removePainter(whitespaceCharacterPainter);
              }
          }
      }
      @Inject
      @Optional
      public void updateButtonByPart(@Named(IServiceConstants.ACTIVE_PART) MPart activePart) {
          if (parte.equals(activePart)) {
              MToolItem item = (MToolItem) modelService.find("zzzz.handledtoolitem.boton",app);
              item.setSelected(buttonStatus);
           }
      } 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        • 2018-12-09
        • 2017-12-26
        相关资源
        最近更新 更多