Как я могу безопасно сменить слушателя? - PullRequest
1 голос
/ 06 ноября 2010

У меня есть приложение, в котором мне нужно часто менять размеры шрифта. Вопрос, опубликованный год назад на этом форуме ( Изменение размера шрифта в SWT ), дал мне некоторую информацию, которая мне была нужна, но у меня все еще есть некоторые неизвестные, которые я еще не выяснил. 1003 *

В частности, кто-то, подписавший 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 голосов
/ 06 ноября 2010

Альтернативой может быть добавление 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();
    }
}

Все зависит от того, создаете ли вы новые метки или нет, и хотите ли вы избавляться от шрифтов немедленно или только при утилизации пользовательского интерфейса.

0 голосов
/ 08 ноября 2010

Если вы часто меняете размер шрифта, вы, вероятно, также вернетесь к размерам, которые вы уже использовали.Поэтому вы можете кэшировать ваши Font экземпляры.Для этого вы можете использовать FontRegistry из JFace ( JavaDoc ) вместо списка.Вам не нужно утилизировать Fonts, так как это делается реестром, когда утилизируется ваш Display.

Вам все равно придется поместить FontData в реестр, если он этого не делаетсодержит размер, который вам нужен.

0 голосов
/ 06 ноября 2010

Вы, вероятно, должны удалить старых слушателей.Сделайте это с:

private DisposeListener listener = null;
//...
if (listener != null)
    label.removeDisposeListener(listener);
listener = new DisposeListener() {
    public void widgetDisposed(DisposeEvent e) {
        newFont.dispose(image);
    }
}
label.addDisposeListener(listener);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...