質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

2915閲覧

startメソッドに書くとエラーになるのはなぜ?

mr0237

総合スコア164

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2017/01/04 06:23

JAVAの初心者です。説明が下手ですいませんが、練習でJavaFXを使ってボタンを押して選択ダイアログを出して、画像を出力するプログラムを作っているのですが、
このように、startメソッドに書くと、↓

Java

1 2package windowkarasakusei; 3 4import java.io.File; 5import javafx.application.Application; 6import javafx.event.ActionEvent; 7import javafx.event.EventHandler; 8import javafx.geometry.Insets; 9import javafx.geometry.Pos; 10import javafx.scene.Scene; 11import javafx.scene.control.Button; 12import javafx.scene.layout.StackPane; 13import javafx.scene.layout.VBox; 14import javafx.stage.FileChooser; 15import javafx.stage.Stage; 16 17public class Windowkarasakusei extends Application { 18 19 @Override 20 public void start(Stage stage) { 21 stage.setTitle("タイトル"); 22 stage.setHeight(900); 23 stage.setWidth(800); 24 Button botan = new Button("画像を開く"); 25 botan.setMaxSize(440, 400); 26 botan.setOnAction(new EventHandler<ActionEvent>() { 27 /* 28 ここら辺に書くとこの部分がエラーになる 29 */ 30 FileChooser fileChooser = new FileChooser();//FileChooserクラスを実体化 31 File sentakuFile = fileChooser.showOpenDialog(null); 32 fileChooser.setTitle("画像ファイル選択"); 33 fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("イメージファイル", "*.jpg", "*.png")); 34 35 /* 36 ここまで 37 */ 38 39 40 @Override 41 public void handle(ActionEvent event) { 42 43 } 44 }); 45 46 VBox root = new VBox(); 47 root.setAlignment(Pos.BOTTOM_CENTER); 48 root.setPadding(new Insets(40, 60, 60, 40)); 49 stage.setScene(new Scene(root)); 50 root.getChildren().addAll(botan); 51 stage.show(); 52 } 53 54 /** 55 * @param args the command line arguments 56 */ 57 public static void main(String[] args) { 58 launch(args); 59 } 60 61} 62

ある部分が「<identifier>がありません。型の開始が不正です」というエラーが出てしまいますが、
handleメソッドの下に書くと↓

Java

1 2package windowkarasakusei; 3 4import java.io.File; 5import javafx.application.Application; 6import javafx.event.ActionEvent; 7import javafx.event.EventHandler; 8import javafx.geometry.Insets; 9import javafx.geometry.Pos; 10import javafx.scene.Scene; 11import javafx.scene.control.Button; 12import javafx.scene.layout.StackPane; 13import javafx.scene.layout.VBox; 14import javafx.stage.FileChooser; 15import javafx.stage.Stage; 16 17public class Windowkarasakusei extends Application { 18 19 @Override 20 public void start(Stage stage) { 21 stage.setTitle("タイトル"); 22 stage.setHeight(900); 23 stage.setWidth(800); 24 Button botan = new Button("画像を開く"); 25 botan.setMaxSize(440, 400); 26 botan.setOnAction(new EventHandler<ActionEvent>() { 27 28 29 @Override 30 public void handle(ActionEvent event) { 31 /* 32 ここら辺に書くとこの部分はエラーにならない 33 */ 34 FileChooser fileChooser = new FileChooser();//FileChooserクラスを実体化 35 File sentakuFile = fileChooser.showOpenDialog(null); 36 fileChooser.setTitle("画像ファイル選択"); 37 fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("イメージファイル", "*.jpg", "*.png")); 38 39 /* 40 ここまで 41 */ 42 43 } 44 }); 45 46 VBox root = new VBox(); 47 root.setAlignment(Pos.BOTTOM_CENTER); 48 root.setPadding(new Insets(40, 60, 60, 40)); 49 stage.setScene(new Scene(root)); 50 root.getChildren().addAll(botan); 51 stage.show(); 52 } 53 54 /** 55 * @param args the command line arguments 56 */ 57 public static void main(String[] args) { 58 launch(args); 59 } 60 61} 62

エラーになりません。

これはなぜなんでしょうか?
わかりやすく教えてください。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/01/07 10:07

インデントはちゃんとしようね
guest

回答1

0

ベストアンサー

そこはstartメソッドの中ではなく、匿名クラスEventHandlerの中です。
最初の方はクラスの中の「フィールド変数の宣言及び初期化」が出来る場所で何かそれ以外のメソッドを書いたのでは?

setOnActionに渡している以下の部分

java

1new EventHandler<ActionEvent>() { 2 /* 略 */ 3}

は、匿名クラスという書き方であり、クラスを記述しています。つまりここの部分は、次のようなクラスをその場で作成し、

java

1class Hoge implements EventHandler<ActionEvent> { 2 3 //A 4 5 @Override 6 public void handle(ActionEvent event) { 7 //B 8 } 9 10}

setOnActionに

java

1setOnAction(new Hoge());

のように渡していることになるのです。

さて本題ですが、エラーが出ているコードは、エラーが出ているコードを「A」の場所に書いている状態になります。この場所はフィールド変数の宣言およびその初期化のみ可能で、それ以外の変数への代入やメソッドの実行はできません。エラーが出ていない後者のコードは、メソッド内の「B」に書いているため問題ないのです。

投稿2017/01/04 06:33

編集2017/01/04 15:41
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mr0237

2017/01/04 07:44

どういうことかよくわかりません。詳しく教えてください。
amadablam

2017/01/05 02:35 編集

回答をくださる方は超能力者ではありません。質問者はあなたのことは何も知らないのですよ。「どういうことかよくわかりません」といった曖昧な表現だけで、一体どこの何がどうわからないのか、あるいは一体どこまでがわかっているのか、それらを察することはできません。わかりやすく教えてくださいとか、詳しく教えてくださいとか言っていますが、そもそも「わかりやすい」や「詳しい」という言葉の意味は、その人の前提となる理解度によってまったく異なってきます。一方的によくわからないから詳しく教えろというような態度では、誰も回答してくれなくなりますよ。少なくともそれだけのコードを自分で書けるスキルがあると仮定するなら、swordoneさんの回答は十分にわかりやすいです。したがって、説明のどの部分までは理解できるが、どの部分が理解できないのか明確に伝える責任があなたにはあります。
swordone

2017/01/05 02:39

いや、それは仕方ないです。このコメントがあった時点では最初の3行しか書いていなかったので…
amadablam

2017/01/05 03:52

そうでしたか。それはわかりませんでした。
mr0237

2017/01/07 09:53

わかりました。ありがとうこざいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問