ハイパーニートプログラマーへの道

頑張ったり頑張らなかったり

JavaFXでサイズ変更可能なcanvasを作る:その2

前回のコードに円を追加してみますた。
色は緑で中心点は画面の中心点と一緒ですが、ウィンドウの大きさの変更に合わせて、大きさも変わります。

f:id:noriyo_tcp:20140505012913p:plain

起動させるとこう。

f:id:noriyo_tcp:20140505012924p:plain

横に伸ばすと、びろーん。

f:id:noriyo_tcp:20140505012932p:plain

縦方向だとこう。

f:id:noriyo_tcp:20140505012938p:plain

このくらいでだいたいまん丸になるかな。

Tip1ResizableCanvas.java

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;


/**
 * Tip 1: A canvas resizing itself to the size of
 *        the parent pane.
 */
public class Tip1ResizableCanvas extends Application {


    class ResizableCanvas extends Canvas {
        public ResizableCanvas() {
            // Redraw canvas when size changes.
            widthProperty().addListener(evt -> draw());
            heightProperty().addListener(evt -> draw());
        }

        private void draw() {
            double width = getWidth();
            double height = getHeight();

            GraphicsContext gc = getGraphicsContext2D();
            gc.clearRect(0, 0, width, height);

            gc.setStroke(Color.RED);
            gc.strokeLine(0, 0, width, height);
            gc.strokeLine(0, height, width, 0);

            double c_width = width / 4;
            double c_height = height / 4;
            gc.setFill(Color.GREEN); 
            gc.fillOval((width / 2) - (c_width / 2), (height / 2) - (c_height / 2), c_width, c_height);

        }

        @Override
        public boolean isResizable() {
            return true;
        }

        @Override
        public double prefWidth(double height) {
            return getWidth();
        }

        @Override
        public double prefHeight(double width) {
            return getHeight();
        }
    }

    @Override
    public void start(Stage stage) throws Exception {
        ResizableCanvas canvas = new ResizableCanvas();

        StackPane stackPane = new StackPane();
        stackPane.getChildren().add(canvas);

        // Bind canvas size to stack pane size.
        canvas.widthProperty().bind(
                       stackPane.widthProperty());
        canvas.heightProperty().bind(
                       stackPane.heightProperty());

        stage.setScene(new Scene(stackPane));
        stage.setTitle("Tip 1: Resizable Canvas");
        // stage.setTitle("Tip 1");
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

起動直後の、この画面のデフォルトのサイズってどこで決まってるんだろうなと。
親クラスであるNodeクラスからCanvasが継承している、prefWidth(),prefHeigtht()辺りが怪しいのかな、とも思うけどよくわからない。

Java技術最前線 - JavaFX 2で始めるGUI開発 第7回 レイアウト その1:ITpro

こちらより、

ノードで指定できるサイズを決めるための情報には次の3種類があります。
最小サイズ minWidth、minHeight
推奨サイズ prefWidth、prefHeight
最大サイズ maxWidth、maxHeight

この内の、推奨サイズとやらが画面のサイズになっているということなのかな?
Oracleおじさんのページへのリンクも張っとくぞ、と。

Canvas (JavaFX 2.2)

Node (JavaFX 2.2)