以前の投稿で、 JavaFX入門の最初のセクションから例を得ることが判明しました。
HelloWorld.java
package helloworld; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class HelloWorld extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello World!"); Button btn = new Button(); btn.setText("Say 'Hello World'"); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } }); StackPane root = new StackPane(); root.getChildren().add(btn); primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } }
この例は、コマンドラインを使用して、jarにコンパイル、起動、パッケージ化され、jarから起動されました。
コマンドライン
@"C:\Program Files\Java\jdk1.7.0_40\bin\javac" -d out -classpath "C:\Program Files\Java\jre7\lib\jfxrt.jar" src\helloworld\HelloWorld.java @"C:\Program Files\Java\jdk1.7.0_40\bin\java" -classpath "C:\Program Files\Java\jre7\lib\jfxrt.jar;.\out" helloworld.HelloWorld @"C:\Program Files\Java\jdk1.7.0_40\bin\javafxpackager" -createjar -appclass helloworld.HelloWorld -srcdir .\out -outfile HelloWorld -v @"C:\Program Files\Java\jre7\bin\java.exe" -jar HelloWorld.jar @pause
各コマンドは、便宜上、.cmdファイルに隠されていました。 面白いが、明確。 これらのコマンドは引き続き使用します。
2番目のセクションでは、
@Override public void start(Stage primaryStage) { primaryStage.setTitle("JavaFX Welcome"); primaryStage.show(); }
タスクは、18行目から29行目を削除し、primaryStageヘッダーを置き換えることです。 この形式では、ファイルはコンパイルされて実行されますが、そのようなナンセンスは判明し、興味深いものはありません。 チュートリアルでは、GridPaneレイアウトを使用することをさらに提案しています。これは、列と行を作成してコントロールを配置できるため、一種の便利さだからです。 primaryStage.show()の前にコードを追加します:
GridPane grid = new GridPane(); grid.setAlignment(Pos.CENTER); grid.setHgap(10); grid.setVgap(10); grid.setPadding(new Insets(25, 25, 25, 25)); Scene scene = new Scene(grid, 300, 275); primaryStage.setScene(scene)
しかし、これはコンパイルされません:
コンパイルエラー
src\helloworld\HelloWorld.java:18: error: cannot find symbol GridPane grid = new GridPane(); ^ symbol: class GridPane location: class HelloWorld src\helloworld\HelloWorld.java:18: error: cannot find symbol GridPane grid = new GridPane(); ^ symbol: class GridPane location: class HelloWorld src\helloworld\HelloWorld.java:19: error: cannot find symbol grid.setAlignment(Pos.CENTER); ^ symbol: variable Pos location: class HelloWorld src\helloworld\HelloWorld.java:22: error: cannot find symbol grid.setPadding(new Insets(25, 25, 25, 25)); ^ symbol: class Insets location: class HelloWorld 4 errors
合計:GridPane、Pos、およびInsetsクラスが見つかりません。 そして、それらをどこで探すべきですか? 私も知りませんでした しかし、Oracleサイトでは、まさにそのような「参照」を見つけました。 それから明らかである
GridPane-javafx.scene.layoutのクラス GridPaneは、行と列の柔軟なグリッド内に子をレイアウトします。 Pos-javafx.geometryの列挙 垂直および水平方向の配置と配置を記述するための一連の値。 Insets-javafx.geometryのクラス 長方形領域の4辺の内側オフセットのセット
これは、インポート行を追加することを意味します。
import javafx.scene.layout.GridPane; import javafx.geometry.*;
これでファイルはコンパイルされて実行されますが、それでもおもしろいものはありません。 チュートリアルの推奨事項に従って引き続き入力します。 グリッドテーブルのPaddingプロパティを設定する行の後、つまりScene scene = new Scene(grid、300、275)の前に、コントロールを含むコードを追加します。
HelloWorld.javaに追加
Text scenetitle = new Text("Welcome"); scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20)); grid.add(scenetitle, 0, 0, 2, 1); Label userName = new Label("User Name:"); grid.add(userName, 0, 1); TextField userTextField = new TextField(); grid.add(userTextField, 1, 1); Label pw = new Label("Password:"); grid.add(pw, 0, 2); PasswordField pwBox = new PasswordField(); grid.add(pwBox, 1, 2); Button btn = new Button("Sign in"); HBox hbBtn = new HBox(10); hbBtn.setAlignment(Pos.BOTTOM_RIGHT); hbBtn.getChildren().add(btn); grid.add(hbBtn, 1, 4); final Text actiontarget = new Text(); grid.add(actiontarget, 1, 6); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { actiontarget.setFill(Color.FIREBRICK); actiontarget.setText("Sign in button pressed"); } });
エラーの長いシートを取得します。 しかし、それらはすでによく知られており、理解可能です。 Text、Font、Label、Color、およびその一部の友人が誰であるかはわかりません。 言及されたリファレンスブックを調べて、どのパッケージにその祖国があるかを確認します。 インポートを追加:
import javafx.scene.text.*; import javafx.scene.control.*; import javafx.scene.paint.*; import javafx.scene.layout.HBox;
ですから、私はここで星に対するarbitrary意的な態度を持っています。 教育目的のために、そうします。
コンパイルして動作するようになりました。 doneを簡単に分解する必要があります。
- javafx.application.Applicationは、JavaFXアプリケーションのメインクラスです。
- そのstart()メソッドはエントリポイントです。
- Stageクラスは、ユーザーインターフェイス(ウィンドウ)を作成するための最上位のコンテナーです。
- Sceneクラスは次のレベルのコンテナであり、すべての要素が含まれています。
- シーンは、テーブルのようなGridPaneに基づいています。GridPaneのセルでは、インターフェイスの要素を配置できます。 HGapとVGapは、それぞれ列と行の間のギャップを定義します。 パディングは、テーブルの端とウィンドウの端の間にギャップを設定します。テーブルは、このギャップに可能な限り耐えようとします。 「grid.setGridLinesVisible(true);」という行は、ウィンドウにテーブルを表示し、その行を表示します。
- 興味深いことに、テーブルの行と列の数はプロパティによって設定されません。 代わりに、特定のセルにいくつかの要素を配置し(列と行を指定することにより)、テーブル「それ自体」が目的の数まで増加します。 grid.addメソッドは、指定されたセル(2番目と3番目のパラメーター-列、行)に要素(最初のパラメーター)を追加します。 4番目と5番目のパラメーターを追加できます(シーンタイトルを追加する場合など)-要素に使用する列と行の数。
- javafxpackagerを使用してJARファイルを作成する場合、JavaFXアプリケーションではmain()メソッドは必要ありません(JavaFX LauncherをJARファイルに埋め込みます)。 ただし、たとえばJavaFXとの統合が不完全なIDEで、JavaFX Launcherを使用せずに作成されたJARファイルを実行できるようにするには、このメソッドを終了しておくと便利です。 繰り返しますが、JavaFXコードを含むSwingアプリケーションにはmain()メソッドが必要です。
- HBoxは、このソケットに挿入されたボタンの配置を、他の要素(右端)とは異なるように設定できる特別なソケットです。
- 残りはコードからかなり明らかです。
CSSですべてに色を付け、FXMLで描画し、これらの文字を1つのアプリケーションに結合することが残っています。
そして、最後に共有したいもう1つの興味深い点です。 以前の投稿で、アプリケーションコードでパッケージHelloWorldを呼び出すと、HelloWorldフォルダーが./outフォルダーに作成され、プログラムはコンパイルされますが、起動しません-クラスが見つかりません。 パッケージ名の文字の大文字と小文字を修正します-フォルダーの大文字と小文字は「間違った」ままですが、すべてが再び動作します。 Windowsはフォルダー名の登録を気にせず、システムはそれを再作成したり名前を変更したりしません。 これは、HelloWorld.classファイルからのプログラムの起動には影響しません。 ただし、.JARにパックして実行しようとすると、エラーが発生します。 アーカイブでは、フォルダーは2文字の誤った(既に引用符なしの)ケースになります。これは、アプリケーションのメインクラスを見つけられないのに十分です。 ./out/HelloWorldフォルダーを消去し、再コンパイルして.jarを作成する必要があります。