我有一个需要经常更改字体大小的应用程序。一年前在这个论坛上发布的一个问题(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);
}
});
假设我使用了这样的代码来频繁更改字体大小。我不是创建整个DisposeListener序列,然后将它们添加到标签的侦听器队列中吗?在添加新的侦听器之前,我是否不需要每次都删除先前的侦听器?还是有某种我不了解的机制使得这一点不必要?
最佳答案
一种替代方法是添加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,它以任何管理Font创建/更改/处置的代码调用方法:
class OtherFontDisposer implements DisposeListener {
@Override
public void widgetDisposed(DisposeEvent e) {
myCleverFontManager.disposeOfAll();
}
}
这完全取决于您是否要创建新标签,以及是否要立即处置字体还是仅在处置UI时处置。