一、问题
window默认的字体大小是9,RedHat Linux默认的字体大小是10。所以在Windowxia显示正常的窗体在Linuxxia会发现Lable太小。所以想设定以下字体的大小,最后发现只有当字体大小为7时才可以显示。
Linux环境下设置了控件的字体以后就会改变控件的背景,但是控件背景的信息并没有丢失,所以需要再调一下设置背景的方法.
二、代码
/**
* <b>機能概要:</b> 设置指定控件以及其子控件字体的大小。<br>
* <br>
* <b>処理フロー:</b> <br>
* <ul>
* <li>设定字体
* <li>设定子控件的字体
* </ul>
*
* @param control 需要设定字体的控件
* <p>
*/
public void applyDialogFont(Control control) {
// 如果控件的字体为系统的默认字体就设定控件的字体,当某些控件设定过字体后就跳过
if (control.getFont().equals(Display.getCurrent().getSystemFont())) {
control.setFont(getDefaultFont());
// Linux环境下,当设置过字体后会导致之前设定的背景色无效,需要重新设置
control.setBackground(control.getBackground());
}
// 设定子控件的字体
if (control instanceof Composite) {
Control[] children = ((Composite) control).getChildren();
for (Control child : children) {
applyDialogFont(child);
}
}
}
/**
* <b>機能概要:</b> 取得本系统的默认字体。<br>
* 需要依赖属性defaultFontHeight,可以通过Spring等IOC框架配置。<br>
* <b>処理フロー:</b> <br>
* <ul>
* <li>取得本系统的默认字体
* </ul>
*
* @param control 需要设定字体的控件
* <p>
*/
public Font getDefaultFont() {
if (defaultFont == null) {
// 取得系统的默认字体
Font defFont = Display.getCurrent().getSystemFont();
FontData[] data = defFont.getFontData();
FontData titleData = null;
if (data.length > 0) {
titleData = new FontData(data[0].getName(), defaultFontHeight, data[0].getStyle());
} else {
titleData = new FontData("", defaultFontHeight, SWT.NONE);
}
// 做成默认字体
defaultFont = new Font(DCContext.getDisplay(), titleData);
}
return defaultFont;
}
三、使用方式
public static void main(String[] args) {
Display display = new Display ();
Shell shell = new Shell (display);
shell.setLayout(new FillLayout());
StyledText styleText = new StyledText(shell, SWT.MULTI | SWT.READ_ONLY | SWT.CENTER);
styleText.setText("This is a Styled Text./n You can set up different style./n");
StyleRange styleRange1 = new StyleRange();
styleRange1.start = 5;
styleRange1.length = 2;
styleRange1.underline = true;
styleText.setStyleRange(styleRange1);
// 设定字体,所有控件窗体完以后调用才有效
StyleUtils.applyDialogFont(parent);
parent.pack();
shell.setSize (500, 150);
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}