4 * License : The MIT License
5 * Copyright(c) 2012 olyutorskii
8 package jp.sfjp.jindolf.glyph;
10 import java.awt.EventQueue;
11 import java.util.LinkedList;
12 import java.util.List;
13 import javax.swing.AbstractListModel;
16 * フォントファミリ名一覧表示用リストのデータモデル。
17 * <p>環境によってはフォントリストを完成させるのに
18 * 数千msかかる場合があるので、その対策として非同期に一覧を読み込む。
19 * <p>実際のリスト作成は裏で走るタスクにより行われ、
20 * リスト完成の暁にはEDTによりリスナに通知される。
22 * 基本的にスレッド間競合の問題はEDTで解決すること。
24 @SuppressWarnings("serial")
25 public class FontListModel extends AbstractListModel {
27 private final List<String> familyList = new LinkedList<String>();
29 private volatile boolean hasDone = false;
33 * <p>コンストラクタ完了と同時にリスト生成タスクが裏で走り始める。
35 public FontListModel(){
38 Runnable task = createFillTask();
48 private Runnable createFillTask(){
49 Runnable task = new Runnable(){
52 @SuppressWarnings("CallToThreadYield")
64 * @param familyNames フォントファミリ名のリスト
67 private int fillList(List<String> familyNames){
68 this.familyList.addAll(familyNames);
70 int size = this.familyList.size();
75 * フォントリストを収集しモデルに反映させる。
77 private void fillModel(){
78 final List<String> fontList = FontUtils.createFontList();
80 // スレッド間競合を避けるため、ここより先の処理はEDT任せ。
81 EventQueue.invokeLater(new Runnable(){
85 int size = fillList(fontList);
90 fireContentsChanged(this, begin, end);
103 private void startTask(Runnable task){
104 Thread thread = new Thread(task);
111 * @return モデルが完成していればtrue
113 public boolean hasCompleted(){
119 * @param index {@inheritDoc}
120 * @return {@inheritDoc}
123 public Object getElementAt(int index){
124 Object result = this.familyList.get(index);
130 * @return {@inheritDoc}
133 public int getSize(){
134 int result = this.familyList.size();