| Revision | 68 (tree) |
|---|---|
| Time | 2023-01-09 09:38:35 |
| Author | |
JPKI PDF SIGNER 1.2.7
スプラッシュスクリーンを廃止しました。
画面の一部が再描画されずに白くなってしまうバグの回避策 prism.dirtyopts=false を追加しました。
広域例外ハンドラーを設定しました。
| @@ -3,11 +3,11 @@ | ||
| 3 | 3 | <head> |
| 4 | 4 | <meta charset="utf-8" /> |
| 5 | 5 | <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| 6 | - <meta http-equiv="refresh" content="1;URL=https://jpki.osdn.jp/"> | |
| 6 | + <meta http-equiv="refresh" content="1;URL=https://aoiro.app/jpki/"> | |
| 7 | 7 | <meta name="description" content="JPKI PDF SIGNER" /> |
| 8 | 8 | <title>JPKI PDF SIGNER</title> |
| 9 | 9 | </head> |
| 10 | 10 | <body> |
| 11 | - See <a href="https://jpki.osdn.jp/">https://jpki.osdn.jp/</a> | |
| 11 | + See <a href="https://aoiro.app/jpki/">https://aoiro.app/jpki/</a> | |
| 12 | 12 | </body> |
| 13 | 13 | </html> |
| @@ -6,7 +6,23 @@ | ||
| 6 | 6 | public class Main { |
| 7 | 7 | |
| 8 | 8 | public static void main(String[] args) { |
| 9 | + // 画面の一部が再描画されずに白くなってしまうバグを回避するために、prism.dirtyopts=false を指定しています。 | |
| 10 | + System.setProperty("prism.dirtyopts", "false"); | |
| 11 | + | |
| 9 | 12 | Platform.setImplicitExit(false); |
| 10 | 13 | SingletonApplication.launch(MainApp.class, args); |
| 14 | + | |
| 15 | + // プロセス終了 | |
| 16 | + // この時点で main (id=1) と DestroyJavaVM の他に AWT-Shutdown などの非デーモンスレッドが残っていることがあります。 | |
| 17 | + // 非デーモンスレッドによってプロセスの終了が遅くなることがあります。 | |
| 18 | + // macOS では特に顕著で main メソッドの復帰からプロセス終了まで 5秒程度かかることもあります。 | |
| 19 | + // この影響で App Store の審査で「メインウィンドウを閉じてもプロセスが終了していない」というリジェクトを受けました。 | |
| 20 | + // 対処として、非デーモンスレッドが残っていても すばやくプロセスを終了できるように System.exit(0) を呼ぶようにしました。 | |
| 21 | + // | |
| 22 | + // exewrap で二重起動を防止している場合は最初の launch が復帰して isStopped == true になったスレッドで System.exit(0) を呼びます。 | |
| 23 | + // isStopped == false の場合は、二重起動時のウィンドウを最前面にするだけの main メソッド呼び出しであり、System.exit(0) を呼び出してはいけません。 | |
| 24 | + if(SingletonApplication.isStopped()) { | |
| 25 | + System.exit(0); | |
| 26 | + } | |
| 11 | 27 | } |
| 12 | 28 | } |
| @@ -141,37 +141,40 @@ | ||
| 141 | 141 | primaryStage.setScene(scene); |
| 142 | 142 | primaryStage.show(); |
| 143 | 143 | |
| 144 | - Thread.currentThread().setUncaughtExceptionHandler(handler); | |
| 144 | + // | |
| 145 | + // 広域例外ハンドラーの設定 | |
| 146 | + // | |
| 147 | + Thread.setDefaultUncaughtExceptionHandler((thread, exception) -> Unchecked.execute(() -> { | |
| 148 | + onCaughtException(thread, exception); | |
| 149 | + })); | |
| 145 | 150 | } |
| 146 | 151 | |
| 147 | - protected Thread.UncaughtExceptionHandler handler = new Thread.UncaughtExceptionHandler() { | |
| 148 | - @Override | |
| 149 | - public void uncaughtException(Thread t, Throwable e) { | |
| 150 | - showException(e); | |
| 151 | - } | |
| 152 | - }; | |
| 153 | - | |
| 154 | - protected void showException(Throwable exception) { | |
| 152 | + /** 例外を補足したときに画面に例外のスタックトレースを表示します。 | |
| 153 | + * | |
| 154 | + * @param thread 例外をスローしたスレッド | |
| 155 | + * @param exception スローされた例外 | |
| 156 | + */ | |
| 157 | + protected void onCaughtException(Thread thread, Throwable exception) { | |
| 155 | 158 | exception.printStackTrace(); |
| 156 | 159 | |
| 157 | - Runnable r = ()-> { | |
| 158 | - String title; | |
| 159 | - if(exception instanceof JpkiException) { | |
| 160 | - title = "エラー"; | |
| 161 | - } else { | |
| 162 | - title = exception.getClass().getName(); | |
| 160 | + Platform.runLater(() -> { | |
| 161 | + try { | |
| 162 | + String title; | |
| 163 | + if(exception instanceof JpkiException) { | |
| 164 | + title = "エラー"; | |
| 165 | + } else { | |
| 166 | + title = exception.getClass().getName(); | |
| 167 | + } | |
| 168 | + String message = exception.getLocalizedMessage(); | |
| 169 | + if(message != null) { | |
| 170 | + message = message.trim(); | |
| 171 | + } | |
| 172 | + toast.show(Toast.COLOR_ERROR, title, message); | |
| 173 | + } catch(Throwable t) { | |
| 174 | + t.printStackTrace(); | |
| 175 | + System.exit(0); | |
| 163 | 176 | } |
| 164 | - String message = exception.getLocalizedMessage(); | |
| 165 | - if(message != null) { | |
| 166 | - message = message.trim(); | |
| 167 | - } | |
| 168 | - toast.show(Toast.COLOR_ERROR, title, message); | |
| 169 | - }; | |
| 170 | - if(Platform.isFxApplicationThread()) { | |
| 171 | - r.run(); | |
| 172 | - } else { | |
| 173 | - Platform.runLater(r); | |
| 174 | - } | |
| 177 | + }); | |
| 175 | 178 | } |
| 176 | 179 | |
| 177 | 180 | @FXML Toast toast; |
| @@ -279,8 +282,6 @@ | ||
| 279 | 282 | lvSignature.getItems().add(signature); |
| 280 | 283 | } |
| 281 | 284 | checkJpkiAvailability(); |
| 282 | - }).onFailed(exception -> { | |
| 283 | - showException(exception); | |
| 284 | 285 | })); |
| 285 | 286 | } |
| 286 | 287 |