SWT窗體字型的設定
一、問題
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 ();
}