77341


ボタンを押したら背景色が変わり、なおかつその色が選ばれました。という JavaFX を書いています。

しかし、画像の赤線の通り、以下のエラーがそれぞれ出ています。

setOnActionの部分:

[code]

    型 ButtonBase のメソッド setOnAction(EventHandler<ActionEvent>) は引数 (Renshu2.SampleEventHandler) に適用できません
    
[/code]

ActionEvent の部分:

[code]

    制約の不一致: 型 ActionEvent は、型 EventHandler<T> の制約付きパラメーター <T extends Event> の代替として有効ではありません
    
[/code]

これらのエラーを解決したいのですが、多分このコードだと、ボタンの背景色が変わるだけだと思うんですが、全体の背景色を変える方法を教えてください。実装の仕方が分かりません。

**ソースコード:**

[code]

    package renshu1;
    
    import java.awt.event.ActionEvent;
    
    import javafx.application.Application;
    import javafx.event.EventHandler;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.layout.Background;
    import javafx.scene.layout.BackgroundFill;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.HBox;
    import javafx.scene.paint.Color;
    import javafx.stage.Stage;
    
    public class Renshu2 extends Application {
        private Label lb1,lb2;
        private Button bt1,bt2,bt3;
    
        public static void main(String[] args) {
            launch(args);
        }
        public void start(Stage stage)throws Exception
        {
            lb1 = new Label("背景色を選んでください。");
            lb2 = new Label("");
            bt1 = new Button("Cyan");
            bt2 = new Button("Yellow");
            bt3 = new Button("Pink");
            
            BorderPane bp = new BorderPane();
            HBox hb = new HBox();
            
            hb.getChildren().add(bt1);
            hb.getChildren().add(bt2);
            hb.getChildren().add(bt3);
            hb.setAlignment(Pos.CENTER);
            
            bp.setTop(lb1);
            bp.setBottom(lb2);
            bp.setCenter(hb);
            
            //イベントハンドラの登録
            bt1.setOnAction(new SampleEventHandler());
            bt2.setOnAction(new SampleEventHandler());
            bt3.setOnAction(new SampleEventHandler());
            
            
            Scene sc = new Scene(bp,300,200);
            
            stage.setScene(sc);
            
            stage.setTitle("背景色の変化");
            stage.show();
        }
        
        class SampleEventHandler implements EventHandler<ActionEvent>, 
        {
            public void handle(ActionEvent e)
            {
                Button tmp = (Button) e.getSource();
                lb2.setText(tmp.getText() + "が選ばれました。");
                if(tmp == bt1)
                bt1.setBackground(new Background(new BackgroundFill(Color.CYAN,null,null)));
                
                else if(tmp == bt2)
                bt2.setBackground(new Background(new BackgroundFill(Color.YELLOW,null,null)));
                else if(tmp == bt3)
                bt3.setBackground(new Background(new BackgroundFill(Color.PINK,null,null)));
                    
                }
                
            }
        
            
            
            
            // TODO 自動生成されたメソッド・スタブ
    
        }
    
[/code]

**エラーメッセージ:**

[code]

    java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
    Caused by: java.lang.Error: Unresolved compilation problem: 
    
        at renshu1.Renshu2.main(Renshu2.java:22)
        ... 11 more
    Exception running application renshu1.Renshu2
    
[/code]

[![](https://i.stack.imgur.com/9Ju69.png)](https://i.stack.imgur.com/9Ju69.png)


CC BY-SA 4.0
2021-06-04T00:31:02.007
76320
2021-06-04T13:54:03.257
2021-06-04T03:50:31.443
3060
45543
question
java javafx
JavaFX でボタンを押したら背景色が変わるコードを作成したい


記載にあったような実行時エラーのまえに、変なカンマがあってコンパイルできませんでした。

[code]

        class SampleEventHandler implements EventHandler<ActionEvent>, 
        {
    
[/code]

また、JavaFXのアプリケーションなのに、awtのActionEventをインポートしているのもなんなのかと。

[code]

    import java.awt.event.ActionEvent;
    
[/code]

> 全体の背景色を変える方法を教えてください。実装の仕方が分かりません。

こんな感じで。

スタイルについては、 <https://docs.oracle.com/javase/jp/8/javafx/api/javafx/scene/doc-
files/cssref.html> をどうぞ。

[code]

    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Label;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.HBox;
    import javafx.stage.Stage;
    
    public class Renshu2 extends Application {
      private Label lb1, lb2;
      private Button bt1, bt2, bt3;
    
      public static void main(String[] args) {
        launch(args);
      }
    
      public void start(Stage stage) throws Exception {
        lb1 = new Label("背景色を選んでください。");
        lb2 = new Label("");
        bt1 = new Button("Cyan");
        bt2 = new Button("Yellow");
        bt3 = new Button("Pink");
    
        final HBox hb = new HBox(bt1, bt2, bt3);
        hb.setAlignment(Pos.CENTER);
    
        final BorderPane bp = new BorderPane();
        bp.setTop(lb1);
        bp.setBottom(lb2);
        bp.setCenter(hb);
    
        //イベントハンドラの登録
        final SampleEventHandler ev = new SampleEventHandler();
        bt1.setOnAction(ev);
        bt2.setOnAction(ev);
        bt3.setOnAction(ev);
    
        Scene sc = new Scene(bp, 300, 200);
    
        stage.setScene(sc);
    
        stage.setTitle("背景色の変化");
        stage.show();
      }
    
      class SampleEventHandler implements EventHandler<ActionEvent> {
        public void handle(ActionEvent e) {
          final Button button = (Button) e.getSource();
          button.getParent().setStyle(String.format("-fx-background-color: %s;", button.getText()));
          lb2.setText(button.getText() + "が選ばれました。");
        }
      }
    }
    
[/code]


CC BY-SA 4.0
2021-06-04T13:54:03.257
77341
2021-06-04T13:54:03.257
46671
76320
answer