我有一个应用程序需要经常更改字体大小。一年前在这个论坛上发布的一个问题(Change just the font size in SWT)给了我一些我需要的信息,但是我还有一些我未知的未知数。
特别是,签名为hudsonb的人提供了一个有用的代码片段,我想在下面重现:
FontData[] fontData = label.getFont().getFontData();
for(int i = 0; i < fontData.length; ++i)
fontData[i].setHeight(14);
final Font newFont = new Font(display, fontData);
label.setFont(newFont);
// Since you created the font, you must dispose it
label.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
newFont.dispose(image);
}
});
假设我使用这样的代码来频繁更改字体大小。我不是在创建一个完整的DisposeListeners序列,并将它们添加到标签的侦听器队列中吗?在添加新侦听器之前,我是不是每次都需要删除以前的侦听器?或者是否有一些我不理解的机制使得这不必要?
答案 0 :(得分:0)
您可能应该删除旧的侦听器。这样做:
private DisposeListener listener = null;
//...
if (listener != null)
label.removeDisposeListener(listener);
listener = new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
newFont.dispose(image);
}
}
label.addDisposeListener(listener);
答案 1 :(得分:0)
另一种方法是添加一个DisposeListener
来维护一个完成后需要处理的字体列表,例如
class FontDisposer implements DisposeListener {
private List<Font> toDispose;
public FontDisposer() {
toDispose = new ArrayList<Font>();
}
@Override
public void widgetDisposed(DisposeEvent e) {
// Dispose all fonts in toDispose
}
public void registerFont(Font f) {
toDispose.add(f);
}
}
class UIWotsit extends SomeUIClass {
private FontDisposer disposer;
public UIWotsit() {
disposer = new FontDisposer();
addDisposeListener(disposer);
}
public void changeFont(Font f) {
disposer.registerFont(f);
// Do all the font changing stuff
}
}
这可能不适合您的特定应用,但拥有维护字体列表的内容可能是一个合理的开始。您还可以使用匿名DisposeListener调用方法,无论代码管理字体创建/更改/处置:
class OtherFontDisposer implements DisposeListener {
@Override
public void widgetDisposed(DisposeEvent e) {
myCleverFontManager.disposeOfAll();
}
}
这完全取决于您是否要创建新标签,以及是否要立即处理字体或仅在处理UI时处理。
答案 2 :(得分:0)
如果经常更改字体大小,您可能还会改回已经使用过的大小。因此,您可能希望缓存Font
个实例。为此,您可以使用JFace中的FontRegistry
(JavaDoc)而不是列表。您无需处置Fonts
,因为这是在您处置Display
时由注册管理机构完成的。
如果您的FontData
不包含您需要的尺寸,则仍需将其放入注册表中。