我有一个需要经常更改字体大小的应用程序。一年前在这个论坛上发布的一个问题(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时处置。

07-26 09:34