/**
* ビジー状態を設定する。
+ *
* <p>EDT以外から呼ばれると実際の処理が次回のEDT移行に遅延される。
+ *
* @param isBusy ビジーならtrue
* @param message ステータスバー表示。nullなら変更なし
*/
/**
* 軽量タスクをEDTで実行する。
+ *
* <p>タスク実行中はビジー状態となる。
+ *
* <p>軽量タスク実行中はイベントループが停止するので、
* 入出力待ちを伴わなずに早急に終わるタスクでなければならない。
+ *
* @param task 軽量タスク
* @param beforeMsg ビジー中ステータス文字列
* @param afterMsg ビジー復帰時のステータス文字列
/**
* 軽量タスクをEDTで実行する。
+ *
* <p>タスク実行中はビジー状態となる。
+ *
* <p>軽量タスク実行中はイベントループが停止するので、
* 入出力待ちを伴わなずに早急に終わるタスクでなければならない。
+ *
* <p>タスク終了時、ステータス文字列はタスク実行前の状態に戻る。
+ *
* @param task 軽量タスク
* @param beforeMsg ビジー中ステータス文字列。
- * ビジー復帰時は元のステータス文字列に戻る。
+ * ビジー復帰時は元のステータス文字列に戻る。
*/
public void submitLightBusyTask(Runnable task, String beforeMsg){
String afterMsg = this.topView.getSysMessage();
/**
* 重量級タスクをEDTとは別のスレッドで実行する。
+ *
* <p>タスク実行中はビジー状態となる。
+ *
* @param heavyTask 重量級タスク
* @param beforeMsg ビジー中ステータス文字列
* @param afterMsg ビジー復帰時のステータス文字列
/**
* 重量級タスクをEDTとは別のスレッドで実行する。
+ *
* <p>タスク実行中はビジー状態となる。
+ *
* <p>タスク終了時、ステータス文字列はタスク実行前の状態に戻る。
+ *
* @param task 重量級タスク
* @param beforeMsg ビジー中ステータス文字列。
- * ビジー復帰時は元のステータス文字列に戻る。
+ * ビジー復帰時は元のステータス文字列に戻る。
*/
public void submitHeavyBusyTask(Runnable task, String beforeMsg){
String afterMsg = this.topView.getSysMessage();
}
/**
- * 指定した国の村一覧を読み込む。(ヘビータスク本体)
+ * 指定した国の村一覧を読み込む。(ヘビータスク本体).
* @param land 国
*/
private void taskReloadVillageList(Land land){
/**
* Jindolf スタートアップクラス。
+ *
* <p>起動用のmainエントリを提供する。
+ *
* <p>JRE実行系の互換性検査を主目的とする。
+ *
* <p>このクラスではJRE1.0互換なランタイムライブラリのみが利用できる。
* このクラスはJDK1.0相当のコンパイラでもコンパイルできなければならない。
+ *
* <p>アプリ開始はstaticメソッド{@link #main(String[])}呼び出しから。
*/
public final class Jindolf {
/**
* 隠しコンストラクタ。
+ *
* <p><code>assert false;</code> 書きたいけど書いちゃだめ。
*/
private Jindolf(){
/**
* Jindolf のスタートアップエントリ。
+ *
* <p>互換性検査が行われた後、
* JRE1.7解除版エントリ{@link JindolfJre17}
* に制御を渡す。
+ *
* @param args コマンドライン引数
*/
public static void main(String[] args){
/**
* JRE1.7の利用が解禁されたJindolfエントリ。
+ *
* <p>起動クラスJindolfの下請けとしての機能が想定される。
+ *
* <p>必ずしも必要ないが、異常系切り分けに有用な、
* 実行環境やビルドの成否に関する各種診断を行う。
+ *
* <p>各種診断を通過した後、JindolfMainに制御を渡す。
*/
public final class JindolfJre17 {
/**
* ビルド時のエンコーディングミスを判定する。
+ *
* <p>※ 非Unicode系の開発環境を使いたい人は適当に無視してね。
+ *
* @return 成功すれば0。失敗したら0以外。
*/
private static int checkSourceEncoding(){
/**
* JVM内で多重起動していないかチェックする。
+ *
* <p>多重起動を確認した場合は、GUIにダイアログを出力する。
+ *
* @return 成功すれば0。失敗したら0以外。
*/
private static int checkHasInvoked(){
/**
* Jindolf のスタートアップエントリ。
+ *
* <p>ここからJRE1.7の利用が解禁される。
+ *
* <p>最終的に{@link JindolfMain}へ制御が渡される。
+ *
* @param args コマンドライン引数
* @return 起動に成功すれば0。失敗したら0以外。
*/
/**
* Jindolf スタートアップクラス。
+ *
* <p>{@link JindolfJre17}の下請けとして本格的なJindolf起動処理に入る。
*/
public final class JindolfMain {
/**
* スプラッシュウィンドウを表示する。
+ *
* <p>JRE1.6以降では何も表示しない。
+ *
* @return スプラッシュウィンドウ。JRE1.6以降ならnullを返す。
*/
@SuppressWarnings("CallToThreadYield")
/**
* JindolfMain のスタートアップエントリ。
+ *
* <p>スプラッシュウィンドウが出ている状態。
* 時間のかかる初期化処理はなるべくこの中へ。
+ *
* @param optinfo コマンドライン引数情報
* @return 起動に成功すれば0。失敗したら0以外。
*/
/**
* JRE互換性のチェックを行う。
+ *
* <p>JREのバージョンと、
* JREに含まれるjava.langパッケージ仕様のバージョンは互換性があるものとする。
+ *
* <p>なるべく昔のJREでも動くように。
* 少なくとも1.2以降。できれば1.0以降。
* 原則、1.3以降の新設ライブラリは利用禁止。
+ *
* <p>なるべく昔のコンパイラでもコンパイルできるように。
* 少なくとも1.2以降。できれば1.0以降。
* 原則、assert文、総称ジェネリクス、アノテーションは禁止。
+ *
* <p>できればBasic-Latinに入らない文字(日本語)の出力も禁止。
+ *
* <p>ランタイム存在検査用のクラスは、ロードや初期化が軽いほうが望ましい。
* そしていずれJindolfの実行に必要なものであるのが望ましい。
* もしそうでない場合でも、
/**
* 隠しコンストラクタ。
+ *
* <p><code>assert false;</code> 書きたいけど書いちゃだめ。
*/
private JreChecker(){
/**
* 指定された文字数で行の長さを改行文字で揃える。
+ *
* <p>サロゲートペアは無視される。
+ *
* @param text 文字列
* @param limit 行ごとの最大文字数
* @return 改行済みの文字列
/**
* JRE環境をチェックする。(JRE1.7)
+ *
* <p>もしJREの非互換性が検出されたらエラーメッセージを報告する。
+ *
* @return 互換性があれば0、無ければ非0
*/
public static int checkJre(){
/**
* Swingダイアログでエラーを報告する。
+ *
* <p>ボタンを押すまでの間、実行はブロックされる。
+ *
* <p>GUIに接続できなければ何か例外を投げるかもしれない。
+ *
* @param text エラー文面
*/
public static void showErrorDialog(String text){
/**
* 各種リソースファイルの管理。
+ *
* <p>{@link Class}用と{@link ClassLoader}用とでは
* 微妙に絶対リソース名の形式が異なることに留意せよ。
+ *
* <p>基本的に、リソースファイルへのアクセスにおける異常系は
* リカバリの対象外とする。(ビルド工程の不手際扱い。)
+ *
* @see java.lang.Class#getResource
*/
public final class ResourceManager {
/**
* リソース名が絶対パスか否か判定する。
+ *
* <p>リソース名が「/」で始まる場合絶対パスとみなされる。
+ *
* <p>このリソース名は{@link Class}用であって
* {@link ClassLoader}用ではない。
+ *
* @param resPath リソース名
* @return 絶対パスならtrueを返す。
* @see java.lang.Class#getResource
/**
* パッケージ情報を反映するリソース名前置詞を返す。
+ *
* <p>パッケージ名のセパレータ「.」は「/」に置き換えられる。
* 無名パッケージの場合は長さゼロの空文字列を返す。
* 無名パッケージを除き、リソース名前置詞は必ず「/」で終わる。
+ *
* <p>この前置詞は{@link ClassLoader}用であって
* {@link Class}用ではないので、
* 頭に「/」が付かない。
+ *
* @param pkg パッケージ設定。nullは無名パッケージと認識される。
* @return リソース名前置詞。無名パッケージの場合は空文字列が返る。
* @see java.lang.Class#getResource
* 任意のルートパッケージと相対リソース名を用いて、
* デフォルトのクラスローダからリソースのURLを取得する。
* @param rootPkg ルートパッケージ情報。
- * 「/」で始まる絶対リソース名が指定された場合は無視される。
+ * 「/」で始まる絶対リソース名が指定された場合は無視される。
* @param resPath リソース名
* @return リソースのURL。リソースが見つからなければnull。
*/
* 任意のクラスローダからリソースのURLを取得する。
* @param loader クラスローダ
* @param rootPkg ルートパッケージ情報。
- * 「/」で始まる絶対リソース名が指定された場合は無視される。
+ * 「/」で始まる絶対リソース名が指定された場合は無視される。
* @param resPath リソース名
* @return リソースのURL。リソースが見つからなければnull。
*/
* 任意のルートパッケージと相対リソース名を用いて、
* デフォルトのクラスローダからリソースの入力ストリームを取得する。
* @param rootPkg ルートパッケージ情報。
- * 「/」で始まる絶対リソース名が指定された場合は無視される。
+ * 「/」で始まる絶対リソース名が指定された場合は無視される。
* @param resPath リソース名
* @return リソースの入力ストリーム。リソースが見つからなければnull。
*/
* 任意のクラスローダからリソースの入力ストリームを取得する。
* @param loader クラスローダ
* @param rootPkg ルートパッケージ情報。
- * 「/」で始まる絶対リソース名が指定された場合は無視される。
+ * 「/」で始まる絶対リソース名が指定された場合は無視される。
* @param resPath リソース名
* @return リソースの入力ストリーム。リソースが見つからなければnull。
*/
/**
* リソース名を用いてUTF-8テキストファイルの内容を取得する。
+ *
* <p>「#」で始まる行はコメント行として無視される。
+ *
* @param resPath テキストファイルのリソース名
* @return テキスト。リソースが読み込めなければnull。
*/
/**
* プロパティからルートパッケージのパッケージ情報を取得する。
+ *
* @param prop プロパティ
* @param prefix 接頭辞
* @param defValue 見つからなかった場合のデフォルト値
/**
* プロパティからパッケージに紐づけられたパッケージ情報を取得する。
+ *
* @param prop プロパティ
* @param prefix 接頭辞
* @param pkg 任意のパッケージ
/**
* 文字列がMavenのマクロフィルタ置換子でありうるか判定する。
+ *
* <p>「${」で始まり「}」で終わる文字列を置換子とみなす。
+ *
* <p>マクロ展開結果がさらに偶然引っかかった場合はあきらめる。
+ *
* @param text 文字列
* @return 置換子でありうるならtrue
*/
/**
* ウィンドウタイトル名を生成する。
+ *
* <p>各ウィンドウタイトルには、他のアプリとの区別のため
* アプリ名が付加される。
+ *
* @param base タイトル基本部
* @return アプリ名が付加されたウィンドウタイトル。
*/
* コンストラクタ。
* @param useStoreFile 設定ディレクトリへの永続化機能を使うならtrue
* @param configPath 設定ディレクトリ。
- * 設定ディレクトリを使わない場合は無視され、nullとして扱われる。
+ * 設定ディレクトリを使わない場合は無視され、nullとして扱われる。
*/
public ConfigStore(boolean useStoreFile, File configPath ){
this(useStoreFile, true, configPath);
* @param useStoreFile 設定ディレクトリへの永続化機能を使うならtrue
* @param isImplicitPath コマンドラインで指定されたディレクトリならfalse
* @param configPath 設定ディレクトリ。
- * 設定ディレクトリを使わない場合は無視され、nullとして扱われる。
+ * 設定ディレクトリを使わない場合は無視され、nullとして扱われる。
*/
public ConfigStore(boolean useStoreFile,
boolean isImplicitPath,
/**
* 設定ディレクトリの存在を確認し、なければ作る。
+ *
* <p>設定ディレクトリを使わない場合は何もしない。
*/
public void prepareConfigDir(){
* 設定ディレクトリ上のOBJECT型JSONファイルを読み込む。
* @param file JSONファイルの相対パス。
* @return JSON object。
- * 設定ディレクトリを使わない設定、
- * もしくはJSONファイルが存在しない、
- * もしくはOBJECT型でなかった、
- * もしくは入力エラーがあればnull
+ * 設定ディレクトリを使わない設定、
+ * もしくはJSONファイルが存在しない、
+ * もしくはOBJECT型でなかった、
+ * もしくは入力エラーがあればnull
*/
public JsObject loadJsObject(File file){
JsComposition<?> root = loadJson(file);
* 設定ディレクトリ上のJSONファイルを読み込む。
* @param file JSONファイルの相対パス
* @return JSON objectまたはarray。
- * 設定ディレクトリを使わない設定、
- * もしくはJSONファイルが存在しない、
- * もしくは入力エラーがあればnull
+ * 設定ディレクトリを使わない設定、
+ * もしくはJSONファイルが存在しない、
+ * もしくは入力エラーがあればnull
*/
public JsComposition<?> loadJson(File file){
if( ! this.useStoreFile ) return null;
/**
* バイトストリーム上のJSONデータを読み込む。
+ *
* <p>バイトストリームはUTF-8と解釈される。
+ *
* @param is バイトストリーム
* @return JSON objectまたはarray。
* @throws IOException 入力エラー
* @param file JSONファイルの相対パス
* @param root JSON objectまたはarray
* @return 正しくセーブが行われればtrue。
- * 何らかの理由でセーブが完了できなければfalse
+ * 何らかの理由でセーブが完了できなければfalse
*/
public boolean saveJson(File file, JsComposition<?> root){
if( ! this.useStoreFile ) return false;
/**
* バイトストリームにJSONデータを書き込む。
+ *
* <p>バイトストリームはUTF-8と解釈される。
+ *
* @param os バイトストリーム出力
* @param root JSON objectまたはarray
* @throws IOException 出力エラー
/**
* ネットワーク設定ファイルを読み込む。
* @return ネットワーク設定データ。
- * 設定を読まないもしくは読めない場合はnull
+ * 設定を読まないもしくは読めない場合はnull
*/
public JsObject loadNetConfig(){
JsObject result = loadJsObject(NETCONFIG_FILE);
/**
* 台詞表示設定ファイルを読み込む。
* @return 台詞表示設定データ。
- * 設定を読まないもしくは読めない場合はnull
+ * 設定を読まないもしくは読めない場合はnull
*/
public JsObject loadTalkConfig(){
JsObject result = loadJsObject(TALKCONFIG_FILE);
* ファイルの読み込みパーミッションを操作する。
* JRE1.6の{@link java.io.File#setReadable(boolean,boolean)}
* の代用品。
+ *
* <p>JRE1.6でなければなにもせずにfalseを返す。
+ *
* @param file ファイルorディレクトリ
* @param flag 操作フラグ
* @param ownerOnly 対象は所有者のみか否か
* ファイルの書き込みパーミッションを操作する。
* JRE1.6の{@link java.io.File#setWritable(boolean,boolean)}
* の代用品。
+ *
* <p>JRE1.6でなければなにもせずにfalseを返す。
+ *
* @param file ファイルorディレクトリ
* @param flag 操作フラグ
* @param ownerOnly 対象は所有者のみか否か
* その格納ディレクトリを返す。
* @param klass 任意のクラス
* @return ロード元JARファイルの格納ディレクトリ。
- * JARが見つからない、もしくはロード元がJARファイルでなければnull。
+ * JARが見つからない、もしくはロード元がJARファイルでなければnull。
*/
public static File getJarDirectory(Class<?> klass){
File jarFile = getClassSourceFile(klass);
* このクラスがローカルJARファイルからロードされたのであれば
* その格納ディレクトリを返す。
* @return ロード元JARファイルの格納ディレクトリ。
- * JARが見つからない、もしくはロード元がJARファイルでなければnull。
+ * JARが見つからない、もしくはロード元がJARファイルでなければnull。
*/
public static File getJarDirectory(){
return getJarDirectory(THISKLASS);
/**
* アプリケーション設定ディレクトリを返す。
* 存在の有無、アクセスの可否は関知しない。
+ *
* <p>WindowsやLinuxではホームディレクトリ。
* Mac OS X ではさらにホームディレクトリの下の
* "Library/Application Support/"
+ *
* @return アプリケーション設定ディレクトリ
*/
public static File getAppSetDir(){
/**
* ロックファイルを用いたVM間ロックオブジェクト。
+ *
* <p>大昔のNFSではうまく動かないかも。
+ *
* <p>一度でもロックに成功したロックファイルは、
* VM終了時に消されてしまうので注意。
*/
/**
* ロック対象のファイルを返す。
+ *
* <p>勝手に作ったり消したりしないように。
+ *
* @return ロック対象ファイル
*/
public File getLockFile(){
/**
* ロックを解除する。
+ *
* <p>自分が作者であるロックファイルは閉じられ削除される。
+ *
* <p>削除に失敗しても無視。
+ *
* <p>シャットダウン処理進行中の場合は何もしない。
*/
public void release(){
/**
* ロックを解除する。{@link #release()}の下請け。
+ *
* <p>自分が作者であるロックファイルは閉じられ削除される。
+ *
* <p>削除に失敗しても無視。
+ *
* <p>シャットダウン処理進行中か否かは無視される。
*/
protected void releaseImpl(){
/**
* 文字列が可変引数のいずれかと英字大小無視で等しいか判定する。
+ *
* <p>※ JRE1.6のString#equalsIgnoreCase の代替も兼ねる。
+ *
* @param text 文字列
* @param names 文字列の可変引数
* @return 等しい物があればtrue
/**
* ウィンドウジオメトリオプション解析。
+ *
* <p>例) WIDTHxHEIGHT+XPOS+YPOS
+ *
* @param info オプション情報格納先
* @param optTxt オプション名文字列
* @param geometry オプション引数
* 古国の場合は村一覧にアクセスせずトップページのみ。
* 古国以外で村建てをやめた国はトップページにアクセスしない。
* 村リストはVillageの実装に従いソートされる。重複する村は排除。
- * @throws java.io.IOException ネットワーク入出力の異常
+ *
* @return ソートされた村一覧
+ * @throws java.io.IOException ネットワーク入出力の異常
*/
public SortedSet<Village> downloadVillageList() throws IOException {
LandDef thisLand = getLandDef();
* 再度パースを行うまで呼んではいけない。
* @return 村一覧
* @throws IllegalStateException パース前に呼び出された。
- * あるいはパース後すでにリセットされている。
+ * あるいはパース後すでにリセットされている。
*/
public List<Village> getVillageList() throws IllegalStateException{
if(this.villageList == null){
* いわゆる「日」。
* 村の進行の一区切り。プロローグやエピローグも含まれる。
*
- * 将来、24時間更新でなくなる可能性の考慮が必要。
+ * <p>将来、24時間更新でなくなる可能性の考慮が必要。
* 人気のないプロローグなどで、
* 24時間以上の期間を持つPeriodが生成される可能性の考慮が必要。
*/
* Periodを更新する。Topicのリストが更新される。
* @param period 日
* @param force trueなら強制再読み込み。
- * falseならまだ読み込んで無い時のみ読み込み。
+ * falseならまだ読み込んで無い時のみ読み込み。
* @throws IOException ネットワーク入力エラー
*/
public static void parsePeriod(Period period, boolean force)
* 指定したエディタの前の通し番号を持つエディタを返す。
* @param editor エディタ
* @return 前のエディタ。
- * 最初のエディタ(通し番号1)が指定されればnullを返す。
+ * 最初のエディタ(通し番号1)が指定されればnullを返す。
*/
private TalkEditor prevEditor(TalkEditor editor){
int sequenceNumber = editor.getSequenceNumber();
/**
* 発言表示画面。
*
- * 表示に影響する要因は、Periodの中身、LayoutManagerによるサイズ変更、
+ * <p>表示に影響する要因は、Periodの中身、LayoutManagerによるサイズ変更、
* フォント属性の指定、フィルタリング操作、ドラッギングによる文字列選択操作、
* 文字列検索および検索ナビゲーション。
*/
/**
* フォント設定に合わせてGUIを更新する。
+ *
* <p>イベント発火は抑止される。
*/
private void updateControlls(){
/**
* 指定文字列が表示可能なフォントファミリ集合を生成する。
+ *
* <p>結構実行時間がかかるかも(数千ms)。乱用禁物。
+ *
* @param checkChars テスト対象の文字が含まれた文字列
* @return フォント集合
*/
/**
* マイクロソフト&リコー(リョービイマジクス)系
* 日本語ベクトルフォントか否か、ファミリ名で見当をつける。
+ *
* <p>日本語Windows同梱のMSゴシックやMS明朝などが対象。
+ *
* <p>メイリオは対象外。
+ *
* @param font フォント
* @return 見当が付けばtrue
*/
/**
* ビットマップフォントか否か見当をつける。
+ *
* <p>判定基準はかなりアバウト。
* 実用上、小さめのMSPゴシックを補足できればそれでいい。
+ *
* <p>ビットマップフォントには
* アンチエイリアスやサブピクセルを使わないほうが
* 見栄えがいいような気がする。
+ *
* @param font 判定対象フォント
* @return ビットマップフォントらしかったらtrue
*/
/**
* フォントに応じた最適な描画設定を生成する。
+ *
* <p>ビットマップフォントと推測されるときは
* アンチエイリアスやサブピクセル補完を無効にする。
+ *
* @param font フォント
* @return 描画設定
*/
/**
* フォントファミリ名一覧表示用リストのデータモデル。
+ *
* <p>環境によってはフォントリストを完成させるのに
* 数千msかかる場合があるので、その対策として非同期に一覧を読み込む。
+ *
* <p>実際のリスト作成はEDTにより行われ、
* リスト完成の暁にはEDTによりリスナに通知される。
* 一般的なリストモデルと同様、
/**
* コンストラクタ。
+ *
* <p>リスト埋めタスクがEDTで走り始める。
*/
public FontListModel(){
/**
* フォントプレビュー用コンポーネント。
+ *
* <p>発言表示部と同じビジュアルを再現する必要のため、GlyphDrawで描画する。
*/
@SuppressWarnings("serial")
/**
* フォント選択リスト。
+ *
* <p>フォント一覧の遅延読み込みに対応。
*/
@SuppressWarnings("serial")
/**
* なにもしない一時的なロギングハンドラ。
* なにがロギングされたのかあとから一括して取得することができる。
+ *
* <p>知らないうちにメモリを圧迫しないよう注意。
*/
public class MomentaryHandler extends Handler{
* Swingテキストコンポーネント用データモデル
* {@link javax.swing.text.Document}
* に出力する{@link java.util.logging.Handler}。
+ *
* <p>スレッド間競合はEDTで解決される。
+ *
* <p>一定の文字数を超えないよう、古い記録は消去される。
*/
public class SwingDocHandler extends Handler{
/**
* ドキュメント末尾に文字列を追加する。
+ *
* <p>EDTから呼ばなければならない。
+ *
* @param logMessage 文字列
*/
private void appendLog(String logMessage){
/**
* ドキュメント先頭部をチョップして最大長に納める。
+ *
* <p>EDTから呼ばなければならない。
*/
private void chopHead(){
/**
* Cookieを用いた人狼BBSサーバとの認証管理を行う。
+ *
* <p>2012-10現在、サポートするのはG国のみ。
+ *
* <p>2012-10より、Cookie "uniqID" の送出も必要になった模様。
*/
public class AuthManager{
/**
* 与えられた文字列に対し
* 「application/x-www-form-urlencoded」符号化を行う。
+ *
* <p>この符号化はHTTPのPOSTメソッドで必要になる。
* この処理は、一般的なPC用Webブラウザにおける、
* HTML文書のFORMタグに伴うsubmit処理を模倣する。
+ *
* <p>生成文字列はUS-ASCIIの範疇に収まる。はず。
+ *
* @param formData 元の文字列
* @return 符号化された文字列
* @see java.net.URLEncoder
/**
* 認証Cookieを取得する。
+ *
* <p>G国での認証Cookie名は"login"。
+ *
* <p>※ 2012-10より"uniqID"も増えた模様だが判定には使わない。
+ *
* @param cookieStore Cookie記憶域
* @return 認証Cookie。認証された状態に無いときはnull。
*/
/**
* これはSwingアプリケーション「Jindolf」を構成するパッケージです。
*
- * Jindolf プロジェクトは、
+ * <p>Jindolf プロジェクトは、
* CGIゲーム
* 「<a href="http://ninjinix.com/">人狼BBS</a>」
* を快適にプレイするための専用クライアントを製作するために発足した
/**
* ある文字列の末尾が別の文字列に一致するか判定する。
- * @see String#endsWith(String)
* @param target 判定対象
* @param term 末尾文字
* @return 一致すればtrue
* @throws java.lang.NullPointerException 引数がnull
+ * @see String#endsWith(String)
*/
public static boolean isTerminated(CharSequence target,
CharSequence term)
/**
* サブシーケンス同士を比較する。
- * @see CharSequence#subSequence(int,int)
* @param seq1 サブシーケンス1
* @param start1 開始インデックス1
* @param end1 終了インデックス1
* @param end2 終了インデックス2
* @return サブシーケンス1の方が小さければ負、大きければ正、等しければ0
* @throws IndexOutOfBoundsException 不正なインデックス指定
+ * @see CharSequence#subSequence(int,int)
*/
public static int compareSubSequence(
CharSequence seq1, int start1, int end1,
/**
* 文字シーケンスとサブシーケンスを比較する。
- * @see CharSequence#subSequence(int,int)
* @param seq1 文字シーケンス
* @param seq2 サブシーケンス
* @param start2 開始インデックス
* @param end2 終了インデックス
* @return 文字シーケンスの方が小さければ負、大きければ正、等しければ0
* @throws IndexOutOfBoundsException 不正なインデックス指定
+ * @see CharSequence#subSequence(int,int)
*/
public static int compareSubSequence(
CharSequence seq1,
/**
* 再帰的に下層コンポーネントのLaFを更新する。
+ *
* <p>{@link javax.swing.SwingUtilities#updateComponentTreeUI(Component)}
* がポップアップメニューのLaF更新を正しく行わないSun製JREのバグ
* [BugID:6299213]
* を回避するために作られた。
+ *
* @param comp 開始コンポーネント
* @see <a href="http://bugs.sun.com/view_bug.do?bug_id=6299213">
- * BugID:6299213
+ * BugID:6299213
* </a>
*/
public static void updateTreeUI(Component comp) {
* 再帰的に下層コンポーネントのLaFを更新する。
* @param comp 開始コンポーネント
* @param isRoot このコンポーネントが最上位か否か指定する。
- * trueが指定された場合、LaF更新作業の後に再レイアウトを促す。
- * パフォーマンスの観点から、ポップアップ以外の下層コンポーネントには
- * 必要のない限りfalse指定を推奨。
+ * trueが指定された場合、LaF更新作業の後に再レイアウトを促す。
+ * パフォーマンスの観点から、
+ * ポップアップ以外の下層コンポーネントには
+ * 必要のない限りfalse指定を推奨。
*/
public static void updateTreeUI(Component comp, boolean isRoot) {
if(comp instanceof JComponent){