如何在swt java中处理按钮的旧字体

如何在swt java中处理按钮的旧字体,java,fonts,swt,Java,Fonts,Swt,我试图定期更新按钮的字体,这就是我实现它的方式 Font font = buttons.getFont(); FontData[] fontData = font.getFontData(); for(int j = 0; j < fontData.length; ++j) { fontData.setStyle(SWT.ITALIC | SWT.BOLD); } font = new Font(display, fontData); buttons.setFont(font);

我试图定期更新按钮的字体,这就是我实现它的方式

Font font = buttons.getFont();
FontData[] fontData = font.getFontData();
for(int j = 0; j < fontData.length; ++j) {
    fontData.setStyle(SWT.ITALIC | SWT.BOLD);
}
font = new Font(display, fontData);

buttons.setFont(font);
Font=buttons.getFont();
FontData[]FontData=font.getFontData();
对于(int j=0;j
但这样做会使程序在一段时间后崩溃,只有一个例外

org.eclipse.swt.SWTError:不再有句柄 位于org.eclipse.swt.swt.error(swt.java:4387) 位于org.eclipse.swt.swt.error(swt.java:4276) 位于org.eclipse.swt.swt.error(swt.java:4247) 位于org.eclipse.swt.widgets.Display.error(Display.java:1258) 位于org.eclipse.swt.widgets.Display.internal_new_GC(Display.java:2673) 位于org.eclipse.swt.graphics.Device.computePoints(Device.java:241) 位于org.eclipse.swt.graphics.Font.getFontData(Font.java:188)

我猜我已经创建了很多字体对象,但没有及时处理它们。但我不知道如何正确处理它们,有人能帮我吗?如果我猜错了,请告诉我
无句柄
异常的真正原因是什么?

尝试使用按钮上的getFont().dispose()和setFont()

final Font arialFont = new Font(Display.getCurrent(), "Arial", 40,
        SWT.NORMAL);
final Font courierFont = new Font(Display.getCurrent(), "Courier New",
        8, SWT.NORMAL);
final Button btn = new Button(parent, SWT.NONE);
btn.setText("New Text");
btn.setSize(100, 30);
btn.setFont(arialFont);
Button changeBtn = new Button(parent, SWT.NONE);
changeBtn.setText("Change Font");
changeBtn.setSize(100, 30);
changeBtn.addSelectionListener(new SelectionListener() {

    @Override
    public void widgetSelected(SelectionEvent arg0) {
        count = count + 1;
        if (count % 2 == 0) {
            btn.getFont().dispose();
            btn.setFont(arialFont);
        } else {
            btn.getFont().dispose();
            btn.setFont(courierFont);
        }
    }

    @Override
    public void widgetDefaultSelected(SelectionEvent arg0) {
        // TODO Auto-generated method stub

    }
});

您的代码提醒我,如果我将这两种字体放在类的私有成员变量中,那么我只创建两种字体,我想我不需要处理它,因为只有两个对象。是吗?我想,不需要处理。您也可以尝试不使用dispose。@richard请记住,尽管您只使用了两个
Font
s,但最终您必须
dispose()
它们。