我從未使用過Java AWT,現在我有一段代碼顯示JFrame
,並將所有子組件的字體屬性設置爲相同的值。我想在一個地方設置屬性。我怎樣才能做到這一點?爲所有子組件設置屬性
在.NET/WinForms中,子控件繼承自它們的父控件,因此只需將Form
實例的字體設置爲使其傳播到所有控件就足夠了。意外的是,這似乎並不適用於AWT。
以下很少的代碼設置所有部件的字體遞歸:
private void setFontForAll(JFrame f, java.awt.Font font) {
f.setFont(font);
setFontRecursive(f.getContentPane().getComponents(), font);
}
private static void setFontRecursive(Component[] components, java.awt.Font font) {
for (Component c : components) {
c.setFont(font);
if (c instanceof java.awt.Container)
setFontRecursive(((java.awt.Container)c).getComponents(), font);
}
}
但是,它有四個缺點:
- 額外的代碼,這實際上可能是大型表格嵌套相當低效佈局面板。
- 代碼是非通用的。如果我將來需要爲另一個屬性做同樣的事情,我必須重寫該方法(或者以簡潔爲代價將其重構爲更一般的方法)。
- 用法是非聲明式的,即必須在表單創建的最後(在所有子組件被初始化並添加之後)調用,而不是以聲明方式在任何地方調用。
- 它不起作用。組件設置正確,但並非所有的東西都是組件。例如,
JPanel
的TitledBorder
s沒有被設置。
謝謝,這看起來相當多才多藝。 – 2009-05-24 08:17:37