私はこのコードをテストしました:
public static void main(String[] args)
{
Application.launch(args);
}
@Override
public void start(Stage primaryStage)
{
// Image
Image image = new Image("za.png");
ImageView imageView = new ImageView();
imageView.setImage(image);
// Text
Text t = new Text();
t.setText("Do you want to quit?");
// Buttons
Button btnYes = new Button("Yes");
Button btnNo = new Button("No");
btnYes.setStyle("-fx-background-color:\n"
+ " #090a0c,\n"
+ " linear-gradient(#38424b 0%, #1f2429 20%, #191d22 100%),\n"
+ " linear-gradient(#20262b, #191d22),\n"
+ " radial-gradient(center 50% 0%, radius 100%, rgba(114,131,148,0.9), rgba(255,255,255,0));\n"
+ " -fx-background-radius: 5,4,3,5;\n"
+ " -fx-background-insets: 0,1,2,0;\n"
+ " -fx-text-fill: white;\n"
+ " -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 );\n"
+ " -fx-font-family: \"Arial\";\n"
+ " -fx-text-fill: linear-gradient(white, #d0d0d0);\n"
+ " -fx-font-size: 12px;\n"
+ " -fx-padding: 10 20 10 20;");
btnNo.setStyle("-fx-background-color:\n"
+ " #090a0c,\n"
+ " linear-gradient(#38424b 0%, #1f2429 20%, #191d22 100%),\n"
+ " linear-gradient(#20262b, #191d22),\n"
+ " radial-gradient(center 50% 0%, radius 100%, rgba(114,131,148,0.9), rgba(255,255,255,0));\n"
+ " -fx-background-radius: 5,4,3,5;\n"
+ " -fx-background-insets: 0,1,2,0;\n"
+ " -fx-text-fill: white;\n"
+ " -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 );\n"
+ " -fx-font-family: \"Arial\";\n"
+ " -fx-text-fill: linear-gradient(white, #d0d0d0);\n"
+ " -fx-font-size: 12px;\n"
+ " -fx-padding: 10 20 10 20;");
// Buttons layout
HBox hbox = new HBox(8); // spacing = 8
hbox.setStyle("-fx-padding: 15; -fx-font-size: 15pt;");
hbox.getChildren().addAll(btnYes, btnNo);
hbox.setAlignment(Pos.BASELINE_RIGHT);
BorderPane bp = new BorderPane();
bp.setStyle("-fx-background-color: linear-gradient(#ffffff,#f3f3f4);\n"
+ " -fx-border-width: 1 1 1 1;\n"
+ " -fx-border-color: #b4b4b4 transparent #b4b4b4 transparent;\n"
+ " -fx-font-size: 1.083333em;\n"
+ " -fx-text-fill: #292929;");
bp.setPadding(new Insets(10, 20, 10, 20));
//Button btnTop = new Button("Top");
bp.setTop(null);
//Button btnLeft = new Button("Left");
bp.setLeft(imageView);
//Button btnCenter = new Button("Center");
bp.setCenter(t);
//Button btnRight = new Button("Right");
bp.setRight(null);
//Button btnBottom = new Button("Bottom");
bp.setBottom(hbox);
Scene scene = new Scene(bp, 500, 200);
primaryStage.setScene(scene);
primaryStage.show();
}
このエラーが発生します:
Executing com.javafx.main.Main from /home/rcbandit/Desktop/test/DX-57DC/dist/run429319394/DX-57DC.jar using platform /opt/jdk1.8.0/bin/Java
Exception in Application start method
Java.lang.reflect.InvocationTargetException
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:491)
at com.javafx.main.Main.launchApp(Main.Java:642)
at com.javafx.main.Main.main(Main.Java:805)
Caused by: Java.lang.RuntimeException: Exception in Application start method
at com.Sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.Java:403)
at com.Sun.javafx.application.LauncherImpl.access$000(LauncherImpl.Java:47)
at com.Sun.javafx.application.LauncherImpl$1.run(LauncherImpl.Java:115)
at Java.lang.Thread.run(Thread.Java:724)
Caused by: Java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.Java:986)
at javafx.scene.image.Image.<init>(Image.Java:538)
at com.dx57dc.main.DX57DC.start(DX57DC.Java:28)
at com.Sun.javafx.application.LauncherImpl$5.run(LauncherImpl.Java:319)
at com.Sun.javafx.application.PlatformImpl$5.run(PlatformImpl.Java:215)
at com.Sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.Java:179)
at com.Sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.Java:176)
at Java.security.AccessController.doPrivileged(Native Method)
at com.Sun.javafx.application.PlatformImpl$4.run(PlatformImpl.Java:176)
at com.Sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.Java:76)
at com.Sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.Sun.glass.ui.gtk.GtkApplication$3$1.run(GtkApplication.Java:82)
... 1 more
Caused by: Java.lang.IllegalArgumentException: Invalid URL or resource not found
at javafx.scene.image.Image.validateUrl(Image.Java:979)
... 12 more
Java Result: 1
Deleting directory /home/rcbandit/Desktop/test/DX-57DC/dist/run429319394
jfxsa-run:
BUILD SUCCESSFUL (total time: 6 seconds)
Javaソースコードファイルの隣に画像ファイルを配置しましたが、ファイルが見つかりません。これを修正する方法を教えてください。
行う
javafx.scene.image.Image image = new javafx.scene.image.Image(getClass().getResource("za.jpg").toExternalForm());
ImageView iv = new ImageView(image);
または単に
ImageView iv = new ImageView(getClass().getResource("za.jpg").toExternalForm());
Image image = new Image("za.png");
これのコンストラクターはURIを指す必要があるため、ファイルシステム上の何かを指している場合は、次のようになります。
Image image = new Image("file:za.png");
または、次のようにすることもできます。
Image image = new Image(new File("za.png").toURI().toString());
...これは間違いなくきれいです。画像がファイルシステムではなくjarにバンドルされている場合は、次のようにURIを取得できます。
Image image = new Image(getClass().getResource("za.jpg").toURI().toString());
この方法で文字列をパラメータとして受け取る(つまり、リソースを指定する)JavaFXのほとんどのメソッド/コンストラクタは、単なるファイルパスやURLではなく文字列URIを介して行います。