• R/O
  • SSH
  • HTTPS

util: コミット


コミットメタ情報

リビジョン230 (tree)
日時2020-09-14 17:02:41
作者hirukawa_ryo

ログメッセージ

* fx-util 0.3.8
Async ExceptionだけでなくErrorを含むThrowableをハンドリングするようにしました。
Fxml setRootを実行するユーティリティメソッドを追加しました。
StageUtil Sceneを基準にStageの最小サイズを指定する setMinSize メソッドを追加しました。

変更サマリ

差分

--- fx-util/trunk/src/main/java/net/osdn/util/javafx/concurrent/Async.java (revision 229)
+++ fx-util/trunk/src/main/java/net/osdn/util/javafx/concurrent/Async.java (revision 230)
@@ -150,18 +150,18 @@
150150 }
151151
152152 protected void cancelled() {
153- Exception exception = null;
153+ Throwable exception = null;
154154 try {
155155 if (cancel != null) {
156156 cancel.onCancelled();
157157 }
158- } catch(Exception e) {
158+ } catch(Throwable e) {
159159 exception = e;
160160 } finally {
161161 if(complete != null) {
162162 try {
163163 complete.onCompleted(State.CANCELLED);
164- } catch(Exception e) {
164+ } catch(Throwable e) {
165165 if(exception == null) {
166166 exception = e;
167167 }
@@ -179,7 +179,7 @@
179179 }
180180
181181 protected void succeeded() {
182- Exception exception = null;
182+ Throwable exception = null;
183183 try {
184184 if (runnableSuccess != null) {
185185 runnableSuccess.onSucceeded();
@@ -186,13 +186,13 @@
186186 } else if (callableSuccess != null) {
187187 callableSuccess.onSucceeded(task.getValue());
188188 }
189- } catch(Exception e) {
189+ } catch(Throwable e) {
190190 exception = e;
191191 } finally {
192192 if(complete != null) {
193193 try {
194194 complete.onCompleted(State.SUCCEEDED);
195- } catch(Exception e) {
195+ } catch(Throwable e) {
196196 if(exception == null) {
197197 exception = e;
198198 }
@@ -210,24 +210,20 @@
210210 }
211211
212212 protected void failed() {
213- Throwable t = task.getException();
214- if(t instanceof Error) {
215- throw (Error)t;
216- }
217- Exception exception = null;
213+ Throwable exception = null;
218214 try {
219215 if (failure != null) {
220- failure.onFailed((Exception)t);
216+ failure.onFailed(task.getException());
221217 } else {
222- exception = (Exception)t;
218+ exception = task.getException();
223219 }
224- } catch(Exception e) {
220+ } catch(Throwable e) {
225221 exception = e;
226222 } finally {
227223 if(complete != null) {
228224 try {
229225 complete.onCompleted(State.FAILED);
230- } catch(Exception e) {
226+ } catch(Throwable e) {
231227 if(exception == null) {
232228 exception = e;
233229 }
@@ -325,7 +321,7 @@
325321
326322 @FunctionalInterface
327323 public interface Failure {
328- void onFailed(Exception exception) throws Exception;
324+ void onFailed(Throwable exception) throws Exception;
329325 }
330326
331327 @FunctionalInterface
--- fx-util/trunk/src/main/java/net/osdn/util/javafx/concurrent/AsyncWrappedException.java (revision 229)
+++ fx-util/trunk/src/main/java/net/osdn/util/javafx/concurrent/AsyncWrappedException.java (revision 230)
@@ -2,7 +2,7 @@
22
33 @SuppressWarnings("serial")
44 public class AsyncWrappedException extends RuntimeException {
5- public AsyncWrappedException(Exception cause) {
5+ public AsyncWrappedException(Throwable cause) {
66 super(cause);
77 }
88 }
--- fx-util/trunk/src/main/java/net/osdn/util/javafx/fxml/Fxml.java (revision 229)
+++ fx-util/trunk/src/main/java/net/osdn/util/javafx/fxml/Fxml.java (revision 230)
@@ -11,6 +11,32 @@
1111 import java.io.UncheckedIOException;
1212
1313 public class Fxml {
14+
15+ public static <T> T load(Class<?> cls) {
16+ String fxmlFilename = cls.getSimpleName() + ".fxml";
17+ FXMLLoader loader = new FXMLLoader(cls.getResource(fxmlFilename));
18+ try {
19+ T obj = loader.load();
20+ fix(obj);
21+ return obj;
22+ } catch (IOException e) {
23+ throw new UncheckedIOException(e);
24+ }
25+ }
26+
27+ public static <T> T load(Object root, Class<?> cls) {
28+ String fxmlFilename = cls.getSimpleName() + ".fxml";
29+ FXMLLoader loader = new FXMLLoader(cls.getResource(fxmlFilename));
30+ loader.setRoot(root);
31+ try {
32+ T obj = loader.load();
33+ fix(obj);
34+ return obj;
35+ } catch (IOException e) {
36+ throw new UncheckedIOException(e);
37+ }
38+ }
39+
1440 public static <T> T load(Object controller) {
1541 String fxmlFilename = controller.getClass().getSimpleName() + ".fxml";
1642 FXMLLoader loader = new FXMLLoader(controller.getClass().getResource(fxmlFilename));
@@ -24,6 +50,33 @@
2450 }
2551 }
2652
53+ public static <T> T load(Object root, Object controller) {
54+ Class<?> cls = null;
55+ if(controller != null) {
56+ cls = controller.getClass();
57+ } else if(root != null) {
58+ cls = root.getClass();
59+ } else {
60+ throw new NullPointerException();
61+ }
62+
63+ String fxmlFilename = cls.getSimpleName() + ".fxml";
64+ FXMLLoader loader = new FXMLLoader(cls.getResource(fxmlFilename));
65+ if(root != null) {
66+ loader.setRoot(root);
67+ }
68+ if(controller != null) {
69+ loader.setController(controller);
70+ }
71+ try {
72+ T obj = loader.load();
73+ fix(obj);
74+ return obj;
75+ } catch (IOException e) {
76+ throw new UncheckedIOException(e);
77+ }
78+ }
79+
2780 public static <T> T load(Object controller, String fxmlFilename) {
2881 FXMLLoader loader = new FXMLLoader(controller.getClass().getResource(fxmlFilename));
2982 loader.setController(controller);
@@ -36,19 +89,28 @@
3689 }
3790 }
3891
39- public static <T> T load(String fxmlFilename) {
40- Class<?> callerClass;
41- try {
42- callerClass = Class.forName(Thread.currentThread().getStackTrace()[2].getClassName());
43- } catch(ClassNotFoundException e) {
44- throw new RuntimeException(e);
92+ public static <T> T load(Object root, Object controller, String fxmlFilename) {
93+ Class<?> cls = null;
94+ if(controller != null) {
95+ cls = controller.getClass();
96+ } else if(root != null) {
97+ cls = root.getClass();
98+ } else {
99+ throw new NullPointerException();
45100 }
101+
102+ FXMLLoader loader = new FXMLLoader(cls.getResource(fxmlFilename));
103+ if(root != null) {
104+ loader.setRoot(root);
105+ }
106+ if(controller != null) {
107+ loader.setController(controller);
108+ }
46109 try {
47- FXMLLoader loader = new FXMLLoader(callerClass.getResource(fxmlFilename));
48110 T obj = loader.load();
49111 fix(obj);
50112 return obj;
51- } catch(IOException e) {
113+ } catch (IOException e) {
52114 throw new UncheckedIOException(e);
53115 }
54116 }
--- fx-util/trunk/src/main/java/net/osdn/util/javafx/stage/StageUtil.java (revision 229)
+++ fx-util/trunk/src/main/java/net/osdn/util/javafx/stage/StageUtil.java (revision 230)
@@ -2,8 +2,12 @@
22
33 import javafx.application.Platform;
44 import javafx.geometry.Rectangle2D;
5+import javafx.scene.Scene;
6+import javafx.scene.control.Control;
7+import javafx.scene.layout.Region;
58 import javafx.stage.Screen;
69 import javafx.stage.Stage;
10+import javafx.stage.StageStyle;
711
812 import java.util.prefs.Preferences;
913
@@ -79,4 +83,35 @@
7983 preferences.putBoolean("stageMaximized", newValue.booleanValue());
8084 });
8185 }
86+
87+ /** 指定サイズのSceneが収まるようにStageの最小サイズを設定します。
88+ *
89+ * StageのsetMinWidth, setMinHeightで指定した場合、Sceneを内包するのに適切なサイズになりません。
90+ * たとえば、Windows 10 で Stage.setMinWidth(1360) と設定した場合、ウィンドウの幅は 1346 になってしまいます。
91+ * これはウィンドウボーダーを考慮しても小さくなりすぎています。
92+ *
93+ * この問題を回避するために、内包する Scene にサイズを設定した後、Stage の sizeToScene で Stage のサイズを Scene に合わせます。
94+ * この Stage のサイズを最小サイズとして設定することで、Scene を収めるのに最適なサイズが設定されます。
95+ *
96+ * @param stage ステージ
97+ * @param width ステージ内側の最小の幅
98+ * @param height ステージ内側の最小の高さ
99+ */
100+ public static void setMinSize(Stage stage, int width, int height) {
101+ Region r = new Region();
102+ r.setPrefSize(width, height);
103+ r.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);
104+ r.setMaxSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);
105+ Scene scene = new Scene(r);
106+ Stage dummy = new Stage(stage.getStyle());
107+ dummy.setScene(scene);
108+ dummy.setOpacity(0.0);
109+ dummy.show();
110+ dummy.sizeToScene();
111+ double minWidth = dummy.getWidth();
112+ double minHeight = dummy.getHeight();
113+ dummy.hide();
114+ stage.setMinWidth(minWidth);
115+ stage.setMinHeight(minHeight);
116+ }
82117 }
旧リポジトリブラウザで表示