我正在使用JComboBox
和自定義ListCellRenderer
製作字體選擇器。我想 JComboBox
顯示所有可用的字體,每個字體名稱顯示在其自己的字體中。我目前使用大約500種字體。如何防止使用自定義ListCellRenderer時JComboBox無響應
ListCellRenerer
一個提供此功能的一個例子:
private class ComboBoxRenderer extends JLabel implements ListCellRenderer {
private JLabel label = new JLabel("Test");
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
Font tempFont = label.getFont();
setFont(new Font((String) value, tempFont.getStyle(),
tempFont.getSize()));
setText((String) value);
return this;
}
}
的問題是,使用此渲染器的情況下,變得JComboBox
程序執行過程中沒有反應。第一次點擊組合框來顯示列表時,需要幾秒鐘才能加載列表。第二次點擊時,該列表即時顯示。
如果一個註釋行
setFont(new Font((String) value, tempFont.getStyle(),tempFont.getSize()));
,組合框的工作就好了。
如何防止這種無反應?
您可能想嘗試創建一個'字體'對象的緩存。用於在90年代緩存'Font'和'FontMetric'。你可以爲每個'Font'創建一個'JLabel'。 – 2011-05-05 10:45:48
但用測試'if(isSelected){'或'cellHasFocus' – mKorbel 2011-05-05 10:45:50
只注意到你說它只是第一次慢,而且你正在使用500字體。我猜加載500個字體是一項相當艱鉅的任務。 – 2011-05-05 10:49:02