• R/O
  • HTTP
  • SSH
  • HTTPS

Jindolf: 提交

Jindolfプロジェクトは、CGIゲーム「人狼BBS」を快適にプレイするための専用クライアントを製作するために発足したオープンソースプロジェクトです。


Commit MetaInfo

修订版0263a50667dad79f4c277c112077cdd666a6583c (tree)
时间2020-02-24 23:11:55
作者Olyutorskii <olyutorskii@user...>
CommiterOlyutorskii

Log Message

Merge branch 'topic/freeparser' into develop

更改概述

差异

--- a/src/main/java/jp/sfjp/jindolf/Controller.java
+++ b/src/main/java/jp/sfjp/jindolf/Controller.java
@@ -7,8 +7,6 @@
77
88 package jp.sfjp.jindolf;
99
10-import java.awt.Component;
11-import java.awt.Cursor;
1210 import java.awt.EventQueue;
1311 import java.awt.Frame;
1412 import java.awt.Window;
@@ -34,7 +32,6 @@ import javax.swing.JOptionPane;
3432 import javax.swing.JToolBar;
3533 import javax.swing.JTree;
3634 import javax.swing.LookAndFeel;
37-import javax.swing.SwingUtilities;
3835 import javax.swing.UIManager;
3936 import javax.swing.UnsupportedLookAndFeelException;
4037 import javax.swing.WindowConstants;
@@ -239,20 +236,12 @@ public class Controller
239236 * @param isBusy ビジーならtrue
240237 * @param message ステータスバー表示。nullなら変更なし
241238 */
242- public void submitBusyStatus(final boolean isBusy, final String message){
243- Runnable task = new Runnable(){
244- /** {@inheritDoc} */
245- @Override
246- public void run(){
247- if(isBusy) setBusy(true);
248- if(message != null) updateStatusBar(message);
249- if( ! isBusy ) setBusy(false);
250- return;
251- }
252- };
253-
254- EventQueue.invokeLater(task);
255-
239+ public void submitBusyStatus(boolean isBusy, String message){
240+ EventQueue.invokeLater(() -> {
241+ if(isBusy) setBusy(true);
242+ if(message != null) updateStatusBar(message);
243+ if( ! isBusy ) setBusy(false);
244+ });
256245 return;
257246 }
258247
@@ -312,29 +301,18 @@ public class Controller
312301 final String afterMsg ){
313302 submitBusyStatus(true, beforeMsg);
314303
315- final Runnable busyManager = new Runnable(){
316- /** {@inheritDoc} */
317- @Override
318- @SuppressWarnings("CallToThreadYield")
319- public void run(){
320- Thread.yield();
321- try{
322- heavyTask.run();
323- }finally{
324- submitBusyStatus(false, afterMsg);
325- }
326- return;
304+ final Runnable busyManager = () -> {
305+ Thread.yield();
306+ try{
307+ heavyTask.run();
308+ }finally{
309+ submitBusyStatus(false, afterMsg);
327310 }
328311 };
329312
330- Runnable forkLauncher = new Runnable(){
331- /** {@inheritDoc} */
332- @Override
333- public void run(){
334- Executor executor = Executors.newCachedThreadPool();
335- executor.execute(busyManager);
336- return;
337- }
313+ Runnable forkLauncher = () -> {
314+ Executor executor = Executors.newCachedThreadPool();
315+ executor.execute(busyManager);
338316 };
339317
340318 EventQueue.invokeLater(forkLauncher);
@@ -543,12 +521,8 @@ public class Controller
543521 return;
544522 }
545523
546- Runnable lafTask = new Runnable(){
547- @Override
548- public void run(){
549- changeLaF(lnf);
550- return;
551- }
524+ Runnable lafTask = () -> {
525+ changeLaF(lnf);
552526 };
553527
554528 submitLightBusyTask(lafTask,
@@ -732,20 +706,12 @@ public class Controller
732706 VillageDigest villageDigest = this.windowManager.getVillageDigest();
733707 final VillageDigest digest = villageDigest;
734708 Executor executor = Executors.newCachedThreadPool();
735- executor.execute(new Runnable(){
736- @Override
737- public void run(){
738- taskFullOpenAllPeriod();
739- EventQueue.invokeLater(new Runnable(){
740- @Override
741- public void run(){
742- digest.setVillage(village);
743- digest.setVisible(true);
744- return;
745- }
746- });
747- return;
748- }
709+ executor.execute(() -> {
710+ taskFullOpenAllPeriod();
711+ EventQueue.invokeLater(() -> {
712+ digest.setVillage(village);
713+ digest.setVisible(true);
714+ });
749715 });
750716
751717 return;
@@ -756,8 +722,7 @@ public class Controller
756722 */
757723 // TODO taskLoadAllPeriodtと一体化したい。
758724 private void taskFullOpenAllPeriod(){
759- setBusy(true);
760- updateStatusBar("一括読み込み開始");
725+ setBusy(true, "一括読み込み開始");
761726 try{
762727 TabBrowser browser = this.topView.getTabBrowser();
763728 Village village = browser.getVillage();
@@ -779,8 +744,7 @@ public class Controller
779744 periodView.showTopics();
780745 }
781746 }finally{
782- updateStatusBar("一括読み込み完了");
783- setBusy(false);
747+ setBusy(false, "一括読み込み完了");
784748 }
785749 return;
786750 }
@@ -836,12 +800,8 @@ public class Controller
836800 */
837801 private void bulkSearch(){
838802 Executor executor = Executors.newCachedThreadPool();
839- executor.execute(new Runnable(){
840- @Override
841- public void run(){
842- taskBulkSearch();
843- return;
844- }
803+ executor.execute(() -> {
804+ taskBulkSearch();
845805 });
846806 }
847807
@@ -994,12 +954,8 @@ public class Controller
994954 */
995955 private void actionLoadAllPeriod(){
996956 Executor executor = Executors.newCachedThreadPool();
997- executor.execute(new Runnable(){
998- @Override
999- public void run(){
1000- taskLoadAllPeriod();
1001- return;
1002- }
957+ executor.execute(() -> {
958+ taskLoadAllPeriod();
1003959 });
1004960
1005961 return;
@@ -1009,8 +965,7 @@ public class Controller
1009965 * 全日程の一括ロード。ヘビータスク版。
1010966 */
1011967 private void taskLoadAllPeriod(){
1012- setBusy(true);
1013- updateStatusBar("一括読み込み開始");
968+ setBusy(true, "一括読み込み開始");
1014969 try{
1015970 TabBrowser browser = this.topView.getTabBrowser();
1016971 Village village = browser.getVillage();
@@ -1031,8 +986,7 @@ public class Controller
1031986 periodView.showTopics();
1032987 }
1033988 }finally{
1034- updateStatusBar("一括読み込み完了");
1035- setBusy(false);
989+ setBusy(false, "一括読み込み完了");
1036990 }
1037991 return;
1038992 }
@@ -1096,7 +1050,7 @@ public class Controller
10961050
10971051 /**
10981052 * アンカー先を含むPeriodの全会話を事前にロードする。
1099- *
1053+ *
11001054 * @param village 村
11011055 * @param anchor アンカー
11021056 * @return アンカー先を含むPeriod。
@@ -1130,55 +1084,45 @@ public class Controller
11301084 if(anchor == null) return;
11311085
11321086 Executor executor = Executors.newCachedThreadPool();
1133- executor.execute(new Runnable(){
1134- @Override
1135- public void run(){
1136- setBusy(true);
1137- updateStatusBar("ジャンプ先の読み込み中…");
1138-
1139- if(anchor.hasTalkNo()){
1140- // TODO もう少し賢くならない?
1141- taskLoadAllPeriod();
1142- }
1087+ executor.execute(() -> {
1088+ setBusy(true, "ジャンプ先の読み込み中…");
11431089
1144- final List<Talk> talkList;
1145- try{
1146- loadAnchoredPeriod(village, anchor);
1147- talkList = village.getTalkListFromAnchor(anchor);
1148- if(talkList == null || talkList.size() <= 0){
1149- updateStatusBar(
1150- "アンカーのジャンプ先["
1151- + anchor.toString()
1152- + "]が見つかりません");
1153- return;
1154- }
1090+ if(anchor.hasTalkNo()){
1091+ // TODO もう少し賢くならない?
1092+ taskLoadAllPeriod();
1093+ }
11551094
1156- final Talk targetTalk = talkList.get(0);
1157- final Period targetPeriod = targetTalk.getPeriod();
1158- final int tabIndex = targetPeriod.getDay() + 1;
1159- final PeriodView target = browser.getPeriodView(tabIndex);
1160-
1161- EventQueue.invokeLater(new Runnable(){
1162- @Override
1163- public void run(){
1164- browser.setSelectedIndex(tabIndex);
1165- target.setPeriod(targetPeriod);
1166- target.scrollToTalk(targetTalk);
1167- return;
1168- }
1169- });
1170- updateStatusBar(
1171- "アンカー["
1172- + anchor.toString()
1173- + "]にジャンプしました");
1174- }catch(IOException e){
1095+ final List<Talk> talkList;
1096+ try{
1097+ loadAnchoredPeriod(village, anchor);
1098+ talkList = village.getTalkListFromAnchor(anchor);
1099+ if(talkList == null || talkList.size() <= 0){
11751100 updateStatusBar(
1176- "アンカーの展開中にエラーが起きました");
1177- }finally{
1178- setBusy(false);
1101+ "アンカーのジャンプ先["
1102+ + anchor.toString()
1103+ + "]が見つかりません");
1104+ return;
11791105 }
11801106
1181- return;
1107+ final Talk targetTalk = talkList.get(0);
1108+ final Period targetPeriod = targetTalk.getPeriod();
1109+ final int tabIndex = targetPeriod.getDay() + 1;
1110+ final PeriodView target = browser.getPeriodView(tabIndex);
1111+
1112+ EventQueue.invokeLater(() -> {
1113+ browser.setSelectedIndex(tabIndex);
1114+ target.setPeriod(targetPeriod);
1115+ target.scrollToTalk(targetTalk);
1116+ });
1117+ updateStatusBar(
1118+ "アンカー["
1119+ + anchor.toString()
1120+ + "]にジャンプしました");
1121+ }catch(IOException e){
1122+ updateStatusBar(
1123+ "アンカーの展開中にエラーが起きました");
1124+ }finally{
1125+ setBusy(false);
11821126 }
11831127 });
11841128
@@ -1190,12 +1134,8 @@ public class Controller
11901134 * @param land 国
11911135 */
11921136 private void submitReloadVillageList(final Land land){
1193- Runnable heavyTask = new Runnable(){
1194- @Override
1195- public void run(){
1196- taskReloadVillageList(land);
1197- return;
1198- }
1137+ Runnable heavyTask = () -> {
1138+ taskReloadVillageList(land);
11991139 };
12001140
12011141 submitHeavyBusyTask(heavyTask,
@@ -1289,12 +1229,8 @@ public class Controller
12891229 return false;
12901230 }
12911231 try{
1292- SwingUtilities.invokeAndWait(new Runnable(){
1293- @Override
1294- public void run(){
1295- tabBrowser.setVillage(village);
1296- return;
1297- }
1232+ EventQueue.invokeAndWait(() -> {
1233+ tabBrowser.setVillage(village);
12981234 });
12991235 }catch(InvocationTargetException | InterruptedException e){
13001236 LOGGER.log(Level.SEVERE,
@@ -1309,12 +1245,8 @@ public class Controller
13091245 try{
13101246 final int lastPos = periodView.getVerticalPosition();
13111247 try{
1312- SwingUtilities.invokeAndWait(new Runnable(){
1313- @Override
1314- public void run(){
1315- periodView.showTopics();
1316- return;
1317- }
1248+ EventQueue.invokeAndWait(() -> {
1249+ periodView.showTopics();
13181250 });
13191251 }catch( InvocationTargetException
13201252 | InterruptedException
@@ -1323,11 +1255,8 @@ public class Controller
13231255 "ブラウザ表示で致命的な障害が発生しました",
13241256 e );
13251257 }
1326- EventQueue.invokeLater(new Runnable(){
1327- @Override
1328- public void run(){
1329- periodView.setVerticalPosition(lastPos);
1330- }
1258+ EventQueue.invokeLater(() -> {
1259+ periodView.setVerticalPosition(lastPos);
13311260 });
13321261 }finally{
13331262 updateStatusBar("レンダリング完了");
@@ -1469,35 +1398,23 @@ public class Controller
14691398 final Village village = (Village) selObj;
14701399
14711400 Executor executor = Executors.newCachedThreadPool();
1472- executor.execute(new Runnable(){
1473- @Override
1474- public void run(){
1475- setBusy(true);
1476- updateStatusBar("村情報を読み込み中…");
1477-
1478- try{
1479- VillageInfoLoader.updateVillageInfo(village);
1480- }catch(IOException e){
1481- showNetworkError(village, e);
1482- return;
1483- }finally{
1484- updateStatusBar("村情報の読み込み完了");
1485- setBusy(false);
1486- }
1487-
1488- Controller.this.actionManager.appearVillage(true);
1489- setFrameTitle(village.getVillageFullName());
1490-
1491- EventQueue.invokeLater(new Runnable(){
1492- @Override
1493- public void run(){
1494- Controller.this.topView.showVillageInfo(village);
1495- return;
1496- }
1497- });
1498-
1401+ executor.execute(() -> {
1402+ setBusy(true, "村情報を読み込み中…");
1403+ try{
1404+ VillageInfoLoader.updateVillageInfo(village);
1405+ }catch(IOException e){
1406+ showNetworkError(village, e);
14991407 return;
1408+ }finally{
1409+ setBusy(false, "村情報の読み込み完了");
15001410 }
1411+
1412+ Controller.this.actionManager.appearVillage(true);
1413+ setFrameTitle(village.getVillageFullName());
1414+
1415+ EventQueue.invokeLater(() -> {
1416+ Controller.this.topView.showVillageInfo(village);
1417+ });
15011418 });
15021419 }
15031420
@@ -1527,67 +1444,103 @@ public class Controller
15271444
15281445 /**
15291446 * {@inheritDoc}
1530- * 主にメニュー選択やボタン押下など。
1531- * @param e イベント {@inheritDoc}
1447+ *
1448+ * <p>主にメニュー選択やボタン押下などのアクションをディスパッチする。
1449+ *
1450+ * <p>ビジーな状態では何もしない。
1451+ *
1452+ * @param ev {@inheritDoc}
15321453 */
15331454 @Override
1534- public void actionPerformed(ActionEvent e){
1455+ public void actionPerformed(ActionEvent ev){
15351456 if(this.isBusyNow) return;
15361457
1537- String cmd = e.getActionCommand();
1538- if(cmd.equals(ActionManager.CMD_ACCOUNT)){
1458+ String cmd = ev.getActionCommand();
1459+ if(cmd == null) return;
1460+
1461+ switch(cmd){
1462+ case ActionManager.CMD_ACCOUNT:
15391463 actionShowAccount();
1540- }else if(cmd.equals(ActionManager.CMD_EXIT)){
1464+ break;
1465+ case ActionManager.CMD_EXIT:
15411466 actionExit();
1542- }else if(cmd.equals(ActionManager.CMD_COPY)){
1467+ break;
1468+ case ActionManager.CMD_COPY:
15431469 actionCopySelected();
1544- }else if(cmd.equals(ActionManager.CMD_SHOWFIND)){
1470+ break;
1471+ case ActionManager.CMD_SHOWFIND:
15451472 actionShowFind();
1546- }else if(cmd.equals(ActionManager.CMD_SEARCHNEXT)){
1473+ break;
1474+ case ActionManager.CMD_SEARCHNEXT:
15471475 actionSearchNext();
1548- }else if(cmd.equals(ActionManager.CMD_SEARCHPREV)){
1476+ break;
1477+ case ActionManager.CMD_SEARCHPREV:
15491478 actionSearchPrev();
1550- }else if(cmd.equals(ActionManager.CMD_ALLPERIOD)){
1479+ break;
1480+ case ActionManager.CMD_ALLPERIOD:
15511481 actionLoadAllPeriod();
1552- }else if(cmd.equals(ActionManager.CMD_SHOWDIGEST)){
1482+ break;
1483+ case ActionManager.CMD_SHOWDIGEST:
15531484 actionShowDigest();
1554- }else if(cmd.equals(ActionManager.CMD_WEBVILL)){
1485+ break;
1486+ case ActionManager.CMD_WEBVILL:
15551487 actionShowWebVillage();
1556- }else if(cmd.equals(ActionManager.CMD_WEBWIKI)){
1488+ break;
1489+ case ActionManager.CMD_WEBWIKI:
15571490 actionShowWebWiki();
1558- }else if(cmd.equals(ActionManager.CMD_RELOAD)){
1491+ break;
1492+ case ActionManager.CMD_RELOAD:
15591493 actionReloadPeriod();
1560- }else if(cmd.equals(ActionManager.CMD_DAYSUMMARY)){
1494+ break;
1495+ case ActionManager.CMD_DAYSUMMARY:
15611496 actionDaySummary();
1562- }else if(cmd.equals(ActionManager.CMD_DAYEXPCSV)){
1497+ break;
1498+ case ActionManager.CMD_DAYEXPCSV:
15631499 actionDayExportCsv();
1564- }else if(cmd.equals(ActionManager.CMD_WEBDAY)){
1500+ break;
1501+ case ActionManager.CMD_WEBDAY:
15651502 actionShowWebDay();
1566- }else if(cmd.equals(ActionManager.CMD_OPTION)){
1503+ break;
1504+ case ActionManager.CMD_OPTION:
15671505 actionOption();
1568- }else if(cmd.equals(ActionManager.CMD_LANDF)){
1506+ break;
1507+ case ActionManager.CMD_LANDF:
15691508 actionChangeLaF();
1570- }else if(cmd.equals(ActionManager.CMD_SHOWFILT)){
1509+ break;
1510+ case ActionManager.CMD_SHOWFILT:
15711511 actionShowFilter();
1572- }else if(cmd.equals(ActionManager.CMD_SHOWEDIT)){
1512+ break;
1513+ case ActionManager.CMD_SHOWEDIT:
15731514 actionTalkPreview();
1574- }else if(cmd.equals(ActionManager.CMD_SHOWLOG)){
1515+ break;
1516+ case ActionManager.CMD_SHOWLOG:
15751517 actionShowLog();
1576- }else if(cmd.equals(ActionManager.CMD_HELPDOC)){
1518+ break;
1519+ case ActionManager.CMD_HELPDOC:
15771520 actionHelp();
1578- }else if(cmd.equals(ActionManager.CMD_SHOWPORTAL)){
1521+ break;
1522+ case ActionManager.CMD_SHOWPORTAL:
15791523 actionShowPortal();
1580- }else if(cmd.equals(ActionManager.CMD_ABOUT)){
1524+ break;
1525+ case ActionManager.CMD_ABOUT:
15811526 actionAbout();
1582- }else if(cmd.equals(ActionManager.CMD_VILLAGELIST)){
1527+ break;
1528+ case ActionManager.CMD_VILLAGELIST:
15831529 actionReloadVillageList();
1584- }else if(cmd.equals(ActionManager.CMD_COPYTALK)){
1530+ break;
1531+ case ActionManager.CMD_COPYTALK:
15851532 actionCopyTalk();
1586- }else if(cmd.equals(ActionManager.CMD_JUMPANCHOR)){
1533+ break;
1534+ case ActionManager.CMD_JUMPANCHOR:
15871535 actionJumpAnchor();
1588- }else if(cmd.equals(ActionManager.CMD_WEBTALK)){
1536+ break;
1537+ case ActionManager.CMD_WEBTALK:
15891538 actionShowWebTalk();
1539+ break;
1540+ default:
1541+ break;
15901542 }
1543+
15911544 return;
15921545 }
15931546
@@ -1644,48 +1597,38 @@ public class Controller
16441597 final Discussion discussion = periodView.getDiscussion();
16451598
16461599 Executor executor = Executors.newCachedThreadPool();
1647- executor.execute(new Runnable(){
1648- @Override
1649- public void run(){
1650- setBusy(true);
1651- updateStatusBar("アンカーの展開中…");
1600+ executor.execute(() -> {
1601+ setBusy(true, "アンカーの展開中…");
16521602
1653- if(anchor.hasTalkNo()){
1654- // TODO もう少し賢くならない?
1655- taskLoadAllPeriod();
1656- }
1603+ if(anchor.hasTalkNo()){
1604+ // TODO もう少し賢くならない?
1605+ taskLoadAllPeriod();
1606+ }
16571607
1658- final List<Talk> talkList;
1659- try{
1660- loadAnchoredPeriod(village, anchor);
1661- talkList = village.getTalkListFromAnchor(anchor);
1662- if(talkList == null || talkList.size() <= 0){
1663- updateStatusBar(
1664- "アンカーの展開先["
1665- + anchor.toString()
1666- + "]が見つかりません");
1667- return;
1668- }
1669- EventQueue.invokeLater(new Runnable(){
1670- @Override
1671- public void run(){
1672- talkDraw.showAnchorTalks(anchor, talkList);
1673- discussion.layoutRows();
1674- return;
1675- }
1676- });
1677- updateStatusBar(
1678- "アンカー["
1679- + anchor.toString()
1680- + "]の展開完了");
1681- }catch(IOException e){
1608+ final List<Talk> talkList;
1609+ try{
1610+ loadAnchoredPeriod(village, anchor);
1611+ talkList = village.getTalkListFromAnchor(anchor);
1612+ if(talkList == null || talkList.size() <= 0){
16821613 updateStatusBar(
1683- "アンカーの展開中にエラーが起きました");
1684- }finally{
1685- setBusy(false);
1614+ "アンカーの展開先["
1615+ + anchor.toString()
1616+ + "]が見つかりません");
1617+ return;
16861618 }
1687-
1688- return;
1619+ EventQueue.invokeLater(() -> {
1620+ talkDraw.showAnchorTalks(anchor, talkList);
1621+ discussion.layoutRows();
1622+ });
1623+ updateStatusBar(
1624+ "アンカー["
1625+ + anchor.toString()
1626+ + "]の展開完了");
1627+ }catch(IOException e){
1628+ updateStatusBar(
1629+ "アンカーの展開中にエラーが起きました");
1630+ }finally{
1631+ setBusy(false);
16891632 }
16901633 });
16911634
@@ -1693,38 +1636,37 @@ public class Controller
16931636 }
16941637
16951638 /**
1696- * ヘビーなタスク実行をアピール。
1639+ * ビジー状態の設定を行う。
1640+ *
1641+ * <p>ヘビーなタスク実行をアピールするために、
16971642 * プログレスバーとカーソルの設定を行う。
1643+ *
1644+ * <p>ビジー中のActionコマンド受信は無視される。
1645+ *
1646+ * <p>ビジー中のトップフレームのマウス操作、キーボード入力は
1647+ * 全てグラブされるため無視される。
1648+ *
16981649 * @param isBusy trueならプログレスバーのアニメ開始&amp;WAITカーソル。
1699- * falseなら停止&amp;通常カーソル。
1650+ * falseなら停止&amp;通常カーソル。
1651+ * @param msg フッタメッセージ。nullなら変更なし。
17001652 */
1701- private void setBusy(final boolean isBusy){
1653+ private void setBusy(boolean isBusy, String msg){
17021654 this.isBusyNow = isBusy;
17031655
1704- Runnable microJob = new Runnable(){
1705- @Override
1706- public void run(){
1707- Cursor cursor;
1708- if(isBusy){
1709- cursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR);
1710- }else{
1711- cursor = Cursor.getDefaultCursor();
1712- }
1713-
1714- Component glass = getTopFrame().getGlassPane();
1715- glass.setCursor(cursor);
1716- glass.setVisible(isBusy);
1717- Controller.this.topView.setBusy(isBusy);
1656+ TopFrame topFrame = getTopFrame();
17181657
1719- return;
1658+ Runnable microJob = () -> {
1659+ topFrame.setBusy(isBusy);
1660+ if(msg != null){
1661+ this.topView.updateSysMessage(msg);
17201662 }
17211663 };
17221664
1723- if(SwingUtilities.isEventDispatchThread()){
1665+ if(EventQueue.isDispatchThread()){
17241666 microJob.run();
17251667 }else{
17261668 try{
1727- SwingUtilities.invokeAndWait(microJob);
1669+ EventQueue.invokeAndWait(microJob);
17281670 }catch(InvocationTargetException | InterruptedException e){
17291671 LOGGER.log(Level.SEVERE, "ビジー処理で失敗", e);
17301672 }
@@ -1734,11 +1676,24 @@ public class Controller
17341676 }
17351677
17361678 /**
1679+ * ビジー状態の設定を行う。
1680+ *
1681+ * <p>フッタメッセージは変更されない。
1682+ * @param isBusy trueならプログレスバーのアニメ開始&amp;WAITカーソル。
1683+ * falseなら停止&amp;通常カーソル。
1684+ */
1685+ private void setBusy(boolean isBusy){
1686+ setBusy(isBusy, null);
1687+ return;
1688+ }
1689+
1690+ /**
17371691 * ステータスバーを更新する。
17381692 * @param message メッセージ
17391693 */
17401694 private void updateStatusBar(String message){
17411695 this.topView.updateSysMessage(message);
1696+ return;
17421697 }
17431698
17441699 /**
--- a/src/main/java/jp/sfjp/jindolf/view/TopFrame.java
+++ b/src/main/java/jp/sfjp/jindolf/view/TopFrame.java
@@ -10,6 +10,7 @@ package jp.sfjp.jindolf.view;
1010 import java.awt.BorderLayout;
1111 import java.awt.Component;
1212 import java.awt.Container;
13+import java.awt.Cursor;
1314 import java.awt.LayoutManager;
1415 import java.awt.event.KeyAdapter;
1516 import java.awt.event.MouseAdapter;
@@ -18,6 +19,7 @@ import javax.swing.JFrame;
1819
1920 /**
2021 * メインアプリウィンドウ。
22+ *
2123 * {@link TopView}をウィンドウ表示するための皮。
2224 */
2325 @SuppressWarnings("serial")
@@ -25,6 +27,7 @@ public class TopFrame extends JFrame{
2527
2628 private final TopView topView = new TopView();
2729
30+
2831 /**
2932 * コンストラクタ。
3033 */
@@ -39,20 +42,24 @@ public class TopFrame extends JFrame{
3942 return;
4043 }
4144
45+
4246 /**
4347 * レイアウトをデザインする。
48+ *
4449 * @param container コンテナ
4550 */
4651 private void design(Container container){
4752 LayoutManager layout = new BorderLayout();
4853 container.setLayout(layout);
4954 container.add(this.topView, BorderLayout.CENTER);
50-
5155 return;
5256 }
5357
5458 /**
5559 * グラスペインのカスタマイズを行う。
60+ *
61+ * <p>このグラスペインは、可視化されている間、
62+ * キーボード入力とマウス入力を無視する。
5663 */
5764 private void modifyGrassPane(){
5865 Component glassPane = new JComponent() {};
@@ -73,4 +80,34 @@ public class TopFrame extends JFrame{
7380 return this.topView;
7481 }
7582
83+ /**
84+ * ビジー状態の設定を行う。
85+ *
86+ * <p>ヘビーなタスク実行をアピールするために、
87+ * プログレスバーとカーソルの設定を行う。
88+ *
89+ * <p>ビジー中のマウス操作、キーボード入力は
90+ * 全てグラブされるため無視される。
91+ *
92+ * @param isBusy trueならプログレスバーのアニメ開始&amp;WAITカーソル。
93+ * falseなら停止&amp;通常カーソル。
94+ */
95+ public void setBusy(boolean isBusy){
96+ Cursor cursor;
97+ if(isBusy){
98+ cursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR);
99+ }else{
100+ cursor = Cursor.getDefaultCursor();
101+ }
102+
103+ Component glassPane = getGlassPane();
104+ glassPane.setCursor(cursor);
105+
106+ this.topView.setBusy(isBusy);
107+
108+ glassPane.setVisible(isBusy);
109+
110+ return;
111+ }
112+
76113 }
--- a/src/main/java/jp/sfjp/jindolf/view/TopView.java
+++ b/src/main/java/jp/sfjp/jindolf/view/TopView.java
@@ -249,9 +249,10 @@ public class TopView extends JPanel{
249249 }
250250
251251 /**
252- * プログレスバーとカーソルの設定を行う。
253- * @param busy trueならプログレスバーのアニメ開始&amp;WAITカーソル。
254- * falseなら停止&amp;通常カーソル。
252+ * プログレスバーの設定を行う。
253+ *
254+ * @param busy trueならプログレスバーのアニメ開始。
255+ * falseなら停止。
255256 */
256257 public void setBusy(boolean busy){
257258 this.progressBar.setIndeterminate(busy);
@@ -266,7 +267,6 @@ public class TopView extends JPanel{
266267 String text = message;
267268 if(message == null) text = "";
268269 this.sysMessage.setText(text); // Thread safe
269- GUIUtils.dispatchEmptyAWTEvent();
270270 return;
271271 }
272272
Show on old repository browser