サンプルExe38a.java
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class Exe28a extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage myStage) {
Button[] kobitoB = new Button[3];
kobitoB[0] = new Button("緑色の小人");
kobitoB[1] = new Button("赤色の小人");
kobitoB[2] = new Button("黄色の小人");
Button clearB = new Button("画像を消す");
Canvas canvas = new Canvas(300, 240);
GraphicsContext gc = canvas.getGraphicsContext2D();
Image[] myImage = new Image[3];
myImage[0] = new Image("kobito1.gif");
myImage[1] = new Image("kobito2.gif");
myImage[2] = new Image("kobito3.gif");
// setOnActionメソッド内で変数「i」は参照できない
for (int i = 0; i < kobitoB.length; i++) {
final int NO = i; //int no = i;でも実質finalと同じ
kobitoB[i].setOnAction((ActionEvent event) -> {
gc.clearRect(135, 100, 30, 32);
gc.drawImage(myImage[NO], 135, 100); //23×32
});
}
// kobitoB[0].setOnAction((ActionEvent event) -> {
// gc.clearRect(135, 100, 30, 32);
// gc.drawImage(myImage[0], 135, 100); //23×32
// });
// kobitoB[1].setOnAction((ActionEvent event) -> {
// gc.clearRect(135, 100, 30, 32);
// gc.drawImage(myImage[1], 135, 100); //25×32
// });
// kobitoB[2].setOnAction((ActionEvent event) -> {
// gc.clearRect(135, 100, 30, 32);
// gc.drawImage(myImage[2], 135, 100); //30×32
// });
clearB.setOnAction((ActionEvent event) -> {
gc.clearRect(135, 100, 30, 32);
});
HBox hBox = new HBox();
// hBox.getChildren().add(kobitoB[0]);
// hBox.getChildren().add(kobitoB[1]);
// hBox.getChildren().add(kobitoB[2]);
for (int i = 0; i < kobitoB.length; i++) {
hBox.getChildren().add(kobitoB[i]);
}
hBox.setAlignment(Pos.CENTER);
BorderPane.setAlignment(clearB, Pos.CENTER);
BorderPane pane = new BorderPane();
pane.setStyle("-fx-background-color: lightgray;");
pane.setTop(hBox);
pane.setBottom(clearB);
pane.setCenter(canvas);
Scene scene = new Scene(pane, 300, 300);
myStage.setTitle("Exe28");
myStage.setScene(scene);
myStage.show();
}
}
↑これ。別の人の質問に先生が答えたバージョン。
難しい点がいくつもある
①いつアクションが来るかわからないのでfor文の中で変数iが参照できないらしい
②final int NOというところにiを格納すると、「定数」となって大丈夫らしい
③ただしfor文の中で宣言された変数は、for文の中でしか生きないよな??
④現にfor文の外でNOを代入しようとするとエクリプスさんはおこらはる
⑤しかしコンピューターのメモリにはこの定数NOは格納されているらしい
ともかくこういうやりかたがあるらしい。
もうひとつ肝心なところがある
「->」
これね。
ラムダ式というやつの記号らしい。
またこれがからんでいると挙動が違うらしい??
とにかくもっと賢くなってからでないと到底理解できない。
プリントに戻る
--->Exe34.java
package application;
import javafx. application.Application;
import javafx.event.ActionEvent;
import javafx. scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx. stage.Stage;
public class EXE34 extends Application {
double posX,posY;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage myStage) {
Canvas canvas = new Canvas(300,300);
GraphicsContext gc = canvas.getGraphicsContext2D();
canvas.setOnMousePressed(e -> {
posX = e.getX();
posY = e.getY();
});
canvas.setOnMouseDragged(e -> {
gc.strokeLine(posX,posY,e.getX(),e.getY());
posX = e.getX();
posY = e.getY();
});
Button clearB = new Button("クリア");//clearBという変数にボタン
clearB.setOnAction((ActionEvent event)->{
gc.clearRect(0,0,canvas.getWidth(),canvas.getHeight());
});
BorderPane pane = new BorderPane();
pane.setStyle("-fx-background-color:lightgray;");
pane.setBottom(clearB);
pane.setCenter(canvas);
Scene scene = new Scene(pane,300,350,Color.LIGHTGRAY);
myStage.setTitle("Exe34");
myStage.setScene(scene);
myStage.show();
}
}
EXE35
ええとヒントの部分で赤ボタンはできるとして、
その配置はhboxになるのかな?
ここまではできたがボタンに色を付けるのはどうやるのだったか
→プリントp24をみましょう
drawB.setStyle("-fx-background-color:black; -fx-text-fill:white;");
これですよ。
cssの記述を2つつなげるときは、しれっと「;」の後にもう一度-fx-から記述する。
あと中央揃えにしてマージンですね。
なんかこうやったらマージンは付いた。
HBox hbox = new HBox(8);
centerもあった。
hbox.setAlignment(Pos.CENTER);
--->Exe35.java
package application;
import javafx. application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx. scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx. stage.Stage;
public class EXE35 extends Application {
double posX,posY;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage myStage) {
Canvas canvas = new Canvas(300,300);
GraphicsContext gc = canvas.getGraphicsContext2D();
canvas.setOnMousePressed(e -> {
posX = e.getX();
posY = e.getY();
});
canvas.setOnMouseDragged(e -> {
gc.strokeLine(posX,posY,e.getX(),e.getY());
posX = e.getX();
posY = e.getY();
});
//-------------------
//ボタン群
//-------------------
Button clearB = new Button("クリア");//clearBという変数にボタン
clearB.setOnAction((ActionEvent event)->{
gc.clearRect(0,0,canvas.getWidth(),canvas.getHeight());
});
Button drawB = new Button("black");
drawB.setOnAction((ActionEvent event)->{
gc.setStroke(Color.BLACK);
//gc.clearRect(0,0,canvas.getWidth(),canvas.getHeight());
});
Button drawR = new Button("red");
drawR.setOnAction((ActionEvent event)->{
gc.setStroke(Color.RED);
//gc.clearRect(0,0,canvas.getWidth(),canvas.getHeight());
});
Button drawG = new Button("green");
drawG.setOnAction((ActionEvent event)->{
gc.setStroke(Color.GREEN);
});
Button drawBlue = new Button("blue");
drawBlue.setOnAction((ActionEvent event)->{
gc.setStroke(Color.BLUE);
});
//-------------------
//ボタンに色を付ける
//-------------------
drawB.setStyle("-fx-background-color:black; -fx-text-fill:white;");
drawR.setStyle("-fx-background-color:red; -fx-text-fill:white;");
drawG.setStyle("-fx-background-color:green; -fx-text-fill:white;");
drawBlue.setStyle("-fx-background-color:blue; -fx-text-fill:white;");
//-------------------
//pane
//-------------------
BorderPane pane = new BorderPane();
HBox hbox = new HBox(8);
hbox.getChildren().addAll(clearB,drawB,drawR, drawG,drawBlue);
hbox.setAlignment(Pos.CENTER);
pane.setStyle("-fx-background-color:lightgray;");
pane.setBottom(hbox);
pane.setCenter(canvas);
Scene scene = new Scene(pane,300,350,Color.LIGHTGRAY);
myStage.setTitle("Exe35");
myStage.setScene(scene);
myStage.show();
}
}