JOptionPane.DEFAULT_OPTION,
GUIUtils.getLogoIcon());
- JDialog dialog = pane.createDialog(getTopFrame(),
- VerInfo.TITLE + "について");
+ JDialog dialog = pane.createDialog(VerInfo.TITLE + "について");
dialog.pack();
dialog.setVisible(true);
JOptionPane pane = new JOptionPane(message,
JOptionPane.WARNING_MESSAGE,
JOptionPane.DEFAULT_OPTION );
- JDialog dialog = pane.createDialog(getTopFrame(), title);
+ JDialog dialog = pane.createDialog(title);
dialog.pack();
dialog.setVisible(true);
dialog.dispose();
JOptionPane.DEFAULT_OPTION );
String title = VerInfo.getFrameTitle("通信異常発生");
- JDialog dialog = pane.createDialog(getTopFrame(), title);
+ JDialog dialog = pane.createDialog(title);
dialog.pack();
dialog.setVisible(true);
import io.github.olyutorskii.quetexj.MvcFacade;
import io.github.olyutorskii.quetexj.SwingLogHandler;
import java.awt.Container;
-import java.awt.Frame;
+import java.awt.Dialog;
import java.util.logging.Handler;
import javax.swing.Action;
import javax.swing.BorderFactory;
/**
* コンストラクタ。
- *
- * @param owner フレームオーナー
*/
- public LogFrame(Frame owner){
- super(owner);
+ public LogFrame(){
+ super((Dialog)null);
+ // We need unowned dialog
this.facade = new MvcFacade();
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
+import java.awt.Dialog;
import java.awt.Dimension;
-import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
* その日ごとの集計。
*/
@SuppressWarnings("serial")
-public class DaySummary extends JDialog
+public final class DaySummary extends JDialog
implements WindowListener, ActionListener, ItemListener{
private static final NumberFormat AVERAGE_FORM;
/**
* コンストラクタ。
- * 集計結果を表示するモーダルダイアログを生成する。
- * @param owner オーナー
+ *
+ * <p>集計結果を表示するモーダルダイアログを生成する。
*/
- public DaySummary(Frame owner){
- super(owner);
+ public DaySummary(){
+ super((Dialog)null);
+ // We need unowned dialog
+
setModal(true);
GUIUtils.modifyWindowAttributes(this, true, false, true);
/**
* 初期のデータモデルを生成する。
+ *
* @return データモデル
*/
private static DefaultTableModel createInitModel(){
/**
* 行を追加する。
+ *
* @param avatar アバター
* @param talkCount 発言回数
* @param totalChars 発言文字総数
/**
* 与えられたPeriodで集計を更新する。
+ *
* @param newPeriod 日
*/
public void summaryPeriod(Period newPeriod){
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
- * ダイアログのクローズボタン押下処理を行う。
+ *
+ * <p>ダイアログのクローズボタン押下処理を行う。
+ *
* @param event ウィンドウ変化イベント {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
- * クローズボタン押下処理。
+ *
+ * <p>クローズボタン押下処理。
+ *
* @param event イベント {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
- * コンボボックス操作処理。
+ *
+ * <p>コンボボックス操作処理。
+ *
* @param event イベント {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
- * セルに{@link Avatar}がきたら顔アイコンと名前を表示する。
+ *
+ * <p>セルに{@link Avatar}がきたら顔アイコンと名前を表示する。
+ *
* @param value {@inheritDoc}
*/
@Override
}
/**
- * {@inheritDoc}
- * 統計種別によってセル色を変える。
+ * {@inheritDoc}
+ *
+ * <p>統計種別によってセル色を変える。
+ *
* @param table {@inheritDoc}
* @param value {@inheritDoc}
* @param isSelected {@inheritDoc}
return result;
}
+
}
}
package jp.sfjp.jindolf.summary;
import java.awt.Container;
+import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.EventQueue;
-import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
* 決着のついた村のダイジェストを表示する。
*/
@SuppressWarnings("serial")
-public class VillageDigest
+public final class VillageDigest
extends JDialog
implements ActionListener,
ItemListener {
/**
* コンストラクタ。
- * @param owner 親フレーム
*/
- public VillageDigest(Frame owner){
- super(owner);
+ @SuppressWarnings("LeakingThisInConstructor")
+ public VillageDigest(){
+ super((Dialog)null);
+ // We need unowned dialog
+
setModal(true);
GUIUtils.modifyWindowAttributes(this, true, false, true);
/**
* キャプション付き項目をコンテナに追加。
+ *
* @param container コンテナ
* @param caption 項目キャプション名
* @param delimiter デリミタ文字
/**
* キャプション付き項目をコンテナに追加。
+ *
* @param container コンテナ
* @param caption 項目キャプション名
* @param item 項目アイテム
/**
* レイアウトの最後に詰め物をする。
+ *
* @param container コンテナ
*/
private static void addFatPad(Container container){
/**
* GridBagLayoutでレイアウトする空コンポーネントを生成する。
+ *
* @return 空コンポーネント
*/
private static JComponent createGridBagComponent(){
/**
* 村サマリ画面の生成。
+ *
* @return 村サマリ画面
*/
private JComponent buildSummaryPanel(){
/**
* プレイヤーサマリ画面の生成。
+ *
* @return プレイヤーサマリ画面
*/
private JComponent buildPlayerPanel(){
/**
* キャスト表生成画面を生成する。
+ *
* @return キャスト表生成画面
*/
private JComponent buildCastPanel(){
/**
* 投票Box生成画面を生成する。
+ *
* @return 投票Box生成画面
*/
private JComponent buildVotePanel(){
/**
* 村詳細Wiki生成画面を生成する。
+ *
* @return 村詳細Wiki生成画面
*/
private JComponent buildVillageWikiPanel(){
/**
* Wikiテキスト領域GUIの生成。
+ *
* @return Wikiテキスト領域GUI
*/
private JComponent buildClipText(){
/**
* テンプレート生成画面を生成する。
+ *
* @return テンプレート生成画面
*/
private JComponent buildClipboardPanel(){
/**
* 画面レイアウトを行う。
+ *
* @param container コンテナ
*/
private void design(Container container){
/**
* 村を設定する。
+ *
* @param village 村
*/
public void setVillage(Village village){
/**
* アクションイベントの振り分け。
+ *
* @param event アクションイベント
*/
@Override
/**
* Wikiテキストをテキストボックスに出力する。
- * スクロール位置は一番上に。
+ *
+ * <p>スクロール位置は一番上に。
+ *
* @param wikiText Wikiテキスト
*/
private void putWikiText(CharSequence wikiText){
/**
* プレイヤーの選択操作。
+ *
* @param avatar 選択されたAvatar
*/
private void selectPlayer(Avatar avatar){
/**
* 顔アイコンセットの選択操作。
+ *
* @param iconSet 顔アイコンセット
*/
private void selectIconSet(FaceIconSet iconSet){
/**
* コンボボックス操作の受信。
+ *
* @param event コンボボックス操作イベント
*/
@Override
package jp.sfjp.jindolf.view;
import java.awt.Container;
-import java.awt.Frame;
+import java.awt.Dialog;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
* 発言フィルタ GUI。
*/
@SuppressWarnings("serial")
-public class FilterPanel extends JDialog
+public final class FilterPanel extends JDialog
implements ActionListener, TopicFilter{
private static final int COLS = 4;
/**
* 発言フィルタを生成する。
- * @param owner フレームオーナー
*/
@SuppressWarnings("LeakingThisInConstructor")
- public FilterPanel(Frame owner){
- super(owner);
+ public FilterPanel(){
+ super((Dialog)null);
+ // We need unowned dialog
+
setModal(false);
GUIUtils.modifyWindowAttributes(this, true, false, true);
/**
* レイアウトデザインを行う。
+ *
* @param topicPanel システムイベント選択
* @param avatarPanel キャラ一覧
* @param buttonPanel ボタン群
/**
* システムイベントチェックボックス群パネルを作成。
+ *
* @return システムイベントチェックボックス群パネル
*/
private JComponent createTopicPanel(){
/**
* キャラ一覧チェックボックス群パネルを作成。
+ *
* @return キャラ一覧チェックボックス群パネル
*/
private JComponent createAvatarPanel(){
/**
* ボタン群パネルを生成。
+ *
* @return ボタン群パネル
*/
private JComponent createButtonPanel(){
/**
* 下段パネルを生成する。
+ *
* @return 下段パネル
*/
private JComponent createBottomPanel(){
/**
* リスナを登録する。
+ *
* @param listener リスナ
*/
public void addChangeListener(ChangeListener listener){
/**
* リスナを削除する。
+ *
* @param listener リスナ
*/
public void removeChangeListener(ChangeListener listener){
/**
* 全リスナを取得する。
+ *
* @return リスナの配列
*/
public ChangeListener[] getChangeListeners(){
}
/**
- * チェックボックスまたはボタン操作時にリスナとして呼ばれる。
* {@inheritDoc}
+ *
+ * <p>チェックボックスまたはボタン操作時にリスナとして呼ばれる。
+ *
* @param event イベント
*/
@Override
/**
* {@inheritDoc}
+ *
* @param topic {@inheritDoc}
* @return {@inheritDoc}
*/
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param context {@inheritDoc}
* @return {@inheritDoc}
*/
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
-import java.awt.Frame;
+import java.awt.Dialog;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
* 検索パネルGUI。
*/
@SuppressWarnings("serial")
-public class FindPanel extends JDialog
+public final class FindPanel extends JDialog
implements ActionListener,
ItemListener,
ChangeListener,
private static final String LABEL_REENTER = "再入力";
private static final String LABEL_IGNORE = "無視して検索をキャンセル";
+
private final JComboBox<Object> findBox = new JComboBox<>();
private final JButton searchButton = new JButton("検索");
private final JButton clearButton = new JButton("クリア");
private boolean canceled = false;
private RegexPattern regexPattern = null;
+
/**
* 検索パネルを生成する。
- * @param owner 親フレーム。
*/
@SuppressWarnings("LeakingThisInConstructor")
- public FindPanel(Frame owner){
- super(owner);
+ public FindPanel(){
+ super((Dialog)null);
+ // We need unowned dialog
+
setModal(true);
GUIUtils.modifyWindowAttributes(this, true, false, true);
return;
}
+
/**
* デザイン・レイアウトを行う。
*/
/**
* {@inheritDoc}
- * 検索ダイアログを表示・非表示する。
+ *
+ * <p>検索ダイアログを表示・非表示する。
+ *
* @param show 表示フラグ。真なら表示。{@inheritDoc}
*/
@Override
/**
* ダイアログが閉じられた原因を判定する。
+ *
* @return キャンセルもしくはクローズボタンでダイアログが閉じられたらtrue
*/
public boolean isCanceled(){
/**
* 一括検索が指定されたか否か返す。
+ *
* @return 一括検索が指定されたらtrue
*/
public boolean isBulkSearch(){
/**
* キャンセルボタン押下処理。
- * このモーダルダイアログを閉じる。
+ *
+ * <p>このモーダルダイアログを閉じる。
*/
private void actionCancel(){
this.canceled = true;
/**
* 検索ボタン押下処理。
- * このモーダルダイアログを閉じる。
+ *
+ * <p>このモーダルダイアログを閉じる。
*/
private void actionSubmit(){
Object selected = this.findBox.getSelectedItem();
/**
* 正規表現パターン異常系のダイアログ表示。
+ *
* @param e 正規表現構文エラー
* @return 再入力が押されたらtrue。それ以外はfalse。
*/
/**
* 現時点での検索パターンを得る。
+ *
* @return 検索パターン
*/
public RegexPattern getRegexPattern(){
/**
* 検索パターンを設定する。
+ *
* @param pattern 検索パターン
*/
public final void setRegexPattern(RegexPattern pattern){
/**
* {@inheritDoc}
- * ボタン操作時にリスナとして呼ばれる。
+ *
+ * <p>ボタン操作時にリスナとして呼ばれる。
+ *
* @param event イベント {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
- * コンボボックスのアイテム選択リスナ。
+ *
+ * <p>コンボボックスのアイテム選択リスナ。
+ *
* @param event アイテム選択イベント {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
- * チェックボックス操作のリスナ。
+ *
+ * <p>チェックボックス操作のリスナ。
+ *
* @param event チェックボックス操作イベント {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
- * コンボボックスのUI変更通知を受け取るリスナ。
+ *
+ * <p>コンボボックスのUI変更通知を受け取るリスナ。
+ *
* @param event UI差し替えイベント {@inheritDoc}
*/
@Override
/**
* コンボボックスエディタを修飾する。
- * マージン修飾と等幅フォントをいじる。
+ *
+ * <p>マージン修飾と等幅フォントをいじる。
+ *
* @param editor エディタ
*/
private void modifyComboBoxEditor(ComboBoxEditor editor){
/**
* JSON形式の検索履歴情報を返す。
+ *
* @return JSON形式の検索履歴情報
*/
public JsObject getJson(){
/**
* JSON形式の検索履歴を反映させる。
+ *
* @param root JSON形式の検索履歴。nullが来たら何もしない
*/
public void putJson(JsObject root){
/**
* 起動時の履歴設定と等価か判定する。
+ *
* @param conf 比較対象
* @return 等価ならtrue
*/
/**
* {@inheritDoc}
+ *
* @param list {@inheritDoc}
* @param value {@inheritDoc}
* @param index {@inheritDoc}
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param item {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param index {@inheritDoc}
* @return {@inheritDoc}
*/
/**
* {@inheritDoc}
+ *
* @return {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param listener {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param listener {@inheritDoc}
*/
@Override
/**
* 検索履歴ヒストリ追加。
+ *
* @param regexPattern 検索履歴
*/
public void addHistory(RegexPattern regexPattern){
/**
* プリセットでない検索ヒストリリストを返す。
+ *
* @return 検索ヒストリリスト
*/
public List<RegexPattern> getOriginalHistoryList(){
package jp.sfjp.jindolf.view;
import java.awt.Container;
-import java.awt.Frame;
+import java.awt.Dialog;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
* オプション設定パネル。
*/
@SuppressWarnings("serial")
-public class OptionPanel
+public final class OptionPanel
extends JDialog
implements ActionListener, WindowListener{
/**
* コンストラクタ。
- * @param owner フレームオーナ
*/
@SuppressWarnings("LeakingThisInConstructor")
- public OptionPanel(Frame owner){
- super(owner);
+ public OptionPanel(){
+ super((Dialog)null);
+ // We need unowned dialog
+
setModal(true);
GUIUtils.modifyWindowAttributes(this, true, false, true);
/**
* レイアウトを行う。
+ *
* @param content コンテナ
*/
private void design(Container content){
/**
* FontChooserを返す。
+ *
* @return FontChooser
*/
public FontChooser getFontChooser(){
/**
* ProxyChooserを返す。
+ *
* @return ProxyChooser
*/
public ProxyChooser getProxyChooser(){
/**
* DialogPrefPanelを返す。
+ *
* @return DialogPrefPanel
*/
public DialogPrefPanel getDialogPrefPanel(){
/**
* ダイアログが閉じられた原因が「キャンセル」か否か判定する。
- * ウィンドウクローズ操作は「キャンセル」扱い。
+ *
+ * <p>ウィンドウクローズ操作は「キャンセル」扱い。
+ *
* @return 「キャンセル」ならtrue
*/
public boolean isCanceled(){
/**
* OKボタン押下処理。
- * ダイアログを閉じる。
+ *
+ * <p>ダイアログを閉じる。
*/
private void actionOk(){
this.isCanceled = false;
/**
* キャンセルボタン押下処理。
- * ダイアログを閉じる。
+ *
+ * <p>ダイアログを閉じる。
*/
private void actionCancel(){
this.isCanceled = true;
/**
* ボタン押下イベント受信。
+ *
* @param event イベント
*/
@Override
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
- * ダイアログを閉じる。
- * キャンセルボタン押下時と同じ。
+ *
+ * <p>ダイアログを閉じる。
+ *
+ * <p>キャンセルボタン押下時と同じ。
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
/**
* {@inheritDoc}
+ *
* @param event {@inheritDoc}
*/
@Override
package jp.sfjp.jindolf.view;
import java.awt.EventQueue;
-import java.awt.Frame;
import java.awt.Window;
import java.util.LinkedList;
import java.util.List;
+import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
/**
* ウィンドウ群の管理を行う。
+ *
+ * <p>原則として閉じても再利用されるウィンドウを管理対象とする。
+ *
+ * <p>管理対象ウィンドウは
+ *
+ * <ul>
+ * <li>アプリのトップウィンドウ
+ * <li>検索ウィンドウ
+ * <li>フィルタウィンドウ
+ * <li>発言集計ウィンドウ
+ * <li>村プレイ記録のダイジェストウィンドウ
+ * <li>オプション設定ウィンドウ
+ * <li>ヘルプウィンドウ
+ * <li>ログウィンドウ
+ * </ul>
+ *
+ * <p>である。
+ *
+ * <p>トップウィンドウとヘルプウィンドウは{@link javax.swing.JFrame}、
+ * その他は{@link javax.swing.JDialog}である。
+ *
+ * <p>非モーダルダイアログは、他のウィンドウの下側にも回れるのが望ましい。
+ *
+ * <p>各ウィンドウは、他のウィンドウの下に完全に隠れても
+ * Windowsタスクバーなどを介して前面に引っ張り出す操作手段を
+ * 提供することが望ましい。
*/
public class WindowManager {
private static final String TITLE_HELP =
getFrameTitle("ヘルプ");
- private static final Frame NULLPARENT = null;
+ private final TopFrame topFrame;
private FilterPanel filterPanel;
private LogFrame logFrame;
private VillageDigest villageDigest;
private DaySummary daySummary;
private HelpFrame helpFrame;
- private TopFrame topFrame;
- private final List<Window> windowSet = new LinkedList<>();
+ private final List<Window> windowSet;
/**
*/
public WindowManager(){
super();
+
+ this.topFrame = new TopFrame();
+ this.topFrame.setVisible(false);
+
+ JOptionPane.setRootFrame(this.topFrame);
+
+ this.windowSet = new LinkedList<>();
+ this.windowSet.add(this.topFrame);
+
return;
}
protected FilterPanel createFilterPanel(){
FilterPanel result;
- result = new FilterPanel(NULLPARENT);
+ result = new FilterPanel();
result.setTitle(TITLE_FILTER);
result.pack();
result.setVisible(false);
protected LogFrame createLogFrame(){
LogFrame result;
- result = new LogFrame(NULLPARENT);
+ result = new LogFrame();
result.setTitle(TITLE_LOGGER);
result.pack();
result.setSize(600, 500);
protected OptionPanel createOptionPanel(){
OptionPanel result;
- result = new OptionPanel(NULLPARENT);
+ result = new OptionPanel();
result.setTitle(TITLE_OPTION);
result.pack();
result.setSize(450, 500);
protected FindPanel createFindPanel(){
FindPanel result;
- result = new FindPanel(NULLPARENT);
+ result = new FindPanel();
result.setTitle(TITLE_FIND);
result.pack();
result.setVisible(false);
protected VillageDigest createVillageDigest(){
VillageDigest result;
- result = new VillageDigest(NULLPARENT);
+ result = new VillageDigest();
result.setTitle(TITLE_DIGEST);
result.pack();
result.setSize(600, 550);
protected DaySummary createDaySummary(){
DaySummary result;
- result = new DaySummary(NULLPARENT);
+ result = new DaySummary();
result.setTitle(TITLE_DAYSUMMARY);
result.pack();
result.setSize(400, 500);
}
/**
- * トップフレームを生成する。
- *
- * @return トップフレーム
- */
- protected TopFrame createTopFrame(){
- TopFrame result = new TopFrame();
- result.setVisible(false);
- this.windowSet.add(result);
- return result;
- }
-
- /**
* トップフレームを返す。
*
* @return トップフレーム
*/
public TopFrame getTopFrame(){
- if(this.topFrame == null){
- this.topFrame = createTopFrame();
- }
return this.topFrame;
}
UIManager.setLookAndFeel(className);
- this.windowSet.forEach((window) -> {
+ this.windowSet.forEach(window -> {
SwingUtilities.updateComponentTreeUI(window);
});
- if(this.filterPanel != null) this.filterPanel.pack();
- if(this.findPanel != null) this.findPanel.pack();
+ if(this.filterPanel != null) this.filterPanel.pack();
+ if(this.findPanel != null) this.findPanel.pack();
return;
}