我怎样才能安全地改变听众呢?

时间:2010-11-05 23:07:50

标签: java swt

我有一个应用程序需要经常更改字体大小。一年前在这个论坛上发布的一个问题(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序列,并将它们添加到标签的侦听器队列中吗?在添加新侦听器之前,我是不是每次都需要删除以前的侦听器?或者是否有一些我不理解的机制使得这不必要?

3 个答案:

答案 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中的FontRegistryJavaDoc)而不是列表。您无需处置Fonts,因为这是在您处置Display时由注册管理机构完成的。

如果您的FontData不包含您需要的尺寸,则仍需将其放入注册表中。