修复了显示组合文本右对齐的 Eclipse 3.6.2 错误

Fix to Eclipse 3.6.2 bug that displays Combo text right aligned

Eclipse 3.6.2 在此处记录了此错误

https://bugs.eclipse.org/bugs/show_bug.cgi?id=358183

有几个建议的解决方法。第一个对我不起作用,但第二个对我有用。

   combo.addListener(SWT.Resize, new Listener() {

        @Override
        public void handleEvent(final Event e) {
            //We need the original text, not the displayed substring which would return methods such as combo.getText() or combo.getItem(combo.getSelectionIndex())   
            String text = combo.getItem((int) combo.getData("selectionIndex"));
            //reset text limit
            combo.setTextLimit(text.length());
            GC gc = new GC(combo);
            //exact dimensions of selected text            
            int textWidth = gc.stringExtent(text).x;
            int magicConst = 14;
            int comboWidth = combo.getClientArea().width - magicConst;
            //In case the text is wider then the area on which it's displayed, we need to set a textLimit
            if (textWidth > comboWidth) {
                //find text limit - first we set it according to average char width of our text
                int averageCharWidth = textWidth / text.length();
                int tempLimit = comboWidth / averageCharWidth;
                //sometimes on resize it can happen that computed tempLimit is greater than text length
                if (tempLimit >= text.length()) {
                    tempLimit = text.length() - 1;
                }
                //then we fine-tune the limit - it must be as precise as possible    
                while (tempLimit > 0 && (comboWidth < gc.stringExtent(text.substring(0, tempLimit + 1)).x)) {
                    tempLimit--;
                }
                //textLimit must not be zero
                if (tempLimit == 0) {
                    tempLimit++;
                }
                combo.setTextLimit(tempLimit);
            }
            combo.setText(text);
            gc.dispose();
        }
    });

但是,当我实现这个时,小部件认为用户已经更改了一些数据(状态更改)。这可能是因为上面调用了

combo.setText(text);

随着我们的系统设置,有一个调用

org.eclipse.ui.forms.ManagedForm.isDirty()

每次用户退出表单时都会提示用户保存数据。

我对 SWT 或 jFace 一点都不熟悉。谁能告诉我

  1. 是否有任何其他方法来解决 Eclipse 3.6 错误?
  2. 如果不是,有没有办法清除组合框的脏状态,这样就不会提示用户保存?

谢谢

仅设置 Combo 的文本不会自动将 ManagedForm 设置为脏文本。因此,您必须向组合添加一个修改侦听器才能进行脏设置。

您可以在执行 setText 之前从组合中删除修改侦听器,然后在 setText 之后将其添加回来。这应该会阻止设置脏标志。