JavaFX、HelloWorld-続き

Windows PCの「JavaFX入門」でOracleが提供した例のHelloWorld。 ログインおよびパスワード入力ウィンドウへのシンプルなアプリケーションの開発。 このアプリケーションのコードが提供されているチュートリアルの誤解の半端なままコマンドラインを使用しています。







以前の投稿で、 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番目のセクションでは、 blackjetコントロールを使用して、ログインおよびパスワード入力フォームを作成することを提案します。 パッケージと&mdash helloworld.HelloWorldクラスをそのままにして、既存の例を開発してみましょう。 jfxpub-get_startedは、NetBeansで新しいプロジェクトを作成することを提案しています。 ただし、「プロジェクトの作成」から最初の3つの段落をスキップし、「start」メソッドの本文を例2-1のコードに置き換えた4番目の段落は、既存のHelloWorld.javaファイルに適用されます。

  @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を簡単に分解する必要があります。



CSSですべてに色を付け、FXMLで描画し、これらの文字を1つのアプリケーションに結合することが残っています。



そして、最後に共有したいもう1つの興味深い点です。 以前の投稿で、アプリケーションコードでパッケージHelloWorldを呼び出すと、HelloWorldフォルダーが./outフォルダーに作成され、プログラムはコンパイルされますが、起動しません-クラスが見つかりません。 パッケージ名の文字の大文字と小文字を修正します-フォルダーの大文字と小文字は「間違った」ままですが、すべてが再び動作します。 Windowsはフォルダー名の登録を気にせず、システムはそれを再作成したり名前を変更したりしません。 これは、HelloWorld.classファイルからのプログラムの起動には影響しません。 ただし、.JARにパックして実行しようとすると、エラーが発生します。 アーカイブでは、フォルダーは2文字の誤った(既に引用符なしの)ケースになります。これは、アプリケーションのメインクラスを見つけられないのに十分です。 ./out/HelloWorldフォルダーを消去し、再コンパイルして.jarを作成する必要があります。



All Articles