修复了显示组合文本右对齐的 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 一点都不熟悉。谁能告诉我
- 是否有任何其他方法来解决 Eclipse 3.6 错误?
- 如果不是,有没有办法清除组合框的脏状态,这样就不会提示用户保存?
谢谢
仅设置 Combo
的文本不会自动将 ManagedForm
设置为脏文本。因此,您必须向组合添加一个修改侦听器才能进行脏设置。
您可以在执行 setText
之前从组合中删除修改侦听器,然后在 setText
之后将其添加回来。这应该会阻止设置脏标志。
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 一点都不熟悉。谁能告诉我
- 是否有任何其他方法来解决 Eclipse 3.6 错误?
- 如果不是,有没有办法清除组合框的脏状态,这样就不会提示用户保存?
谢谢
仅设置 Combo
的文本不会自动将 ManagedForm
设置为脏文本。因此,您必须向组合添加一个修改侦听器才能进行脏设置。
您可以在执行 setText
之前从组合中删除修改侦听器,然后在 setText
之后将其添加回来。这应该会阻止设置脏标志。