Java Eclipse-自定义启动配置-应用/恢复按钮

Java Eclipse-自定义启动配置-应用/恢复按钮,java,eclipse,eclipse-plugin,swt,Java,Eclipse,Eclipse Plugin,Swt,我正在自定义启动配置类型。我实现了LaunchConfiguration选项卡,并遇到了一个奇怪的问题。当我做以下事情时 private void update() { setDirty(true); updateLaunchConfigurationDialog(); } 在我的LaunchConfiguration选项卡类的一个地方,它工作正常,应用按钮变为启用状态。但是当我在另一个地方做的时候,它就不起作用了。我在上发现了类似的东西,但它并没有帮助我解决这个问题 请参阅下

我正在自定义启动配置类型。我实现了LaunchConfiguration选项卡,并遇到了一个奇怪的问题。当我做以下事情时

private void update() {
    setDirty(true);
    updateLaunchConfigurationDialog();
}
在我的LaunchConfiguration选项卡类的一个地方,它工作正常,应用按钮变为启用状态。但是当我在另一个地方做的时候,它就不起作用了。我在上发现了类似的东西,但它并没有帮助我解决这个问题

请参阅下面的代码片段

    addButton.addMouseListener(new MouseListenerAdapter() {

        @Override
        public void mouseDown(MouseEvent e) {
            moveSelectionToTableViewer(tree.getViewer().getTree().getSelection());
            table.refresh();
            update(); // Apply button is enabled
        }

        private void moveSelectionToTableViewer(TreeItem[] selection) {
            // ...
        }
    });

    removeButton.addMouseListener(new MouseListenerAdapter() {

        @Override
        public void mouseDown(MouseEvent e) {
            int[] selectionIndices = table.getTable().getSelectionIndices();
            table.getTable().remove(selectionIndices);
            tree.getViewer().refresh();
            update(); // Apply button is NOT enabled!
        }
    });

我如何解决这个问题?

我不知道你的问题仅仅是从这些信息,但有几件事需要检查:

  • 您是否已验证正在调用
    setDirty(true)
    (例如,使用println或断点?)
  • 您是否在
    org.eclipse.debug.ui.AbstractLaunchConfigurationTab.fDirty
    上放了一块手表,看看它是否会变回来
  • 您是否正在覆盖isDirty
  • 正在从表中删除an项,导致启动配置以某种方式变得无效,即当启动配置中存在无效值时,您无法应用。例如,要保存,对于属于启动配置的所有选项卡,
    canSave
    必须返回
    true
    这是设置应用按钮启用状态的位置之一:

    org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationTabGroupViewer.updateButtons()

  • 考虑一下您是否需要鼠标侦听器。请注意,您正在响应MouseDown,如果有人切换到控件并按Enter/Space键,这可能不会达到预期效果。更典型的做法是为按钮添加一个
    addSelectionListener
    。(甚至可能是在这个不寻常的时刻对事件的反应导致了问题?)

  • 1.是的,看看update()方法,setDirty(true)当然被调用为2。好主意,我会在几个小时后检查并在这里报告,谢谢。四号。我不这么认为。你能澄清一下在启动配置中什么是无效的吗?用更多信息更新了4。顺便说一句,对于1,我可以看到update()调用setDirty(),但我不能确定的是,当您按下鼠标时,是否确实在调用该方法,并且没有其他错误(例如,refresh中隐藏的异常)。很抱歉,如果我对1非常基本,没有冒犯的意思,如果您已经验证了这一点,我只想要最好的答案。添加了第五个选项,尽管我建议您无论如何进行更改:-)我覆盖了所有选项卡的canSave(),现在它只返回true。在调用
    updateLanchConfigurationDialog()之前和之后,我还检查了
    isDirty()
    canSave()
    。它总是真的。此外,我还使用
    SelectionListener
    removeButton
    上重新设置了
    MouseListener
    ,并覆盖了
    widgetSelected()
    方法。我检查了当用户单击
    remove按钮时是否调用了
    update()
    方法。但不幸的是,它没有解决这个问题,在clicling
    removeButton
    之后,“应用”和“还原”按钮仍然被禁用。还有其他选择吗?我想我已经被这个问题弄疯了:(当你点击删除按钮时,你有没有在org.eclipse.debug.internal.ui.launchConfigurations.LaunchConfigurationTabGroupViewer.updateButtons上设置断点?断点命中了吗?如果没有,试着从更新()中单步执行)如果你解决了问题,请贴出答案并接受:-)另一个可能澄清问题的问题。如果您执行“添加”(启用应用),然后执行“删除”,是否会禁用应用按钮?作为旁注:用SelectionAdapter替换MouseListener。添加和删除后,应用按钮将保持启用状态。是的,我会换的,谢谢
    /**
     * updates the button states
     */
    private void updateButtons() {
        boolean dirty = isDirty() && canSave();
        fApplyButton.setEnabled(dirty);
        fRevertButton.setEnabled(dirty);
    }