javafx场景构建器自定义组件

时间:2015-04-25 09:57:00

标签: javafx custom-component scenebuilder

我想在场景构建器中使用自定义组件。
我想在自定义组件中嵌入画布。所以我试着改变属性的画布。
像这样的画布代码:

    package test;

    import javafx.scene.canvas.Canvas;
    import javafx.scene.canvas.GraphicsContext;

    public class DrawCanvas extends Canvas{
        public DrawCanvas() {
            draw();
        }

        private void draw() {
            // TODO Auto-generated method stub
            double width = getWidth();
            double height = getHeight();
            GraphicsContext gc = getGraphicsContext2D();
            gc.strokeLine(0,0,50,50);
        }
    }


自定义组件代码如下:

    package test;

    import java.io.IOException;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.layout.BorderPane;

    public class Test extends BorderPane{

        public Test() {
            super();
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Test.fxml"));
            fxmlLoader.setRoot(this);
            fxmlLoader.setController(this);
            try {
                fxmlLoader.load();
            } catch (IOException exception) {
                throw new RuntimeException(exception);
            }
        }
    }


fxml文件:

    <?xml version="1.0" encoding="UTF-8"?>

    <?import javafx.scene.layout.BorderPane?>
    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.canvas.Canvas?>


    <fx:root xmlns:fx="http://javafx.com/fxml" type="javafx.scene.layout.BorderPane">
        <center>
        </center>
    </fx:root>

我以这种方式尝试过,但失败了。

    <?import javafx.scene.layout.BorderPane?>
    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.canvas.Canvas?>
    <?import org.korecky.myjavafx.fxml10.DrawCanvas?>
    <fx:root xmlns:fx="http://javafx.com/fxml" type="javafx.scene.layout.BorderPane">
        <center>
            <DrawCanvas ></DrawCanvas>
        </center>
    </fx:root>

请给我建议和提示。

1 个答案:

答案 0 :(得分:4)

您的方法对我有用,但您需要创建一个有效的画布,提供一些尺寸,否则这些将是0x0。例如:

private void draw() {
    setWidth(50);
    setHeight(50);
    GraphicsContext gc = getGraphicsContext2D();
    gc.strokeLine(0,0,50,50);
}

现在您可以将DrawCanvas组件导入到SceneBuilder中,正如@jewelsea建议的那样,您可以将其拖到场景中:

canvas

您可以向该类添加一些属性,例如canvasWidthcanvasHeight

public class DrawCanvas extends Canvas {

    private final GraphicsContext gc;

    public DrawCanvas() {
        gc = getGraphicsContext2D();
        draw();
    }

    private void draw() {
        setWidth(canvasWidth.get());
        setHeight(canvasHeight.get());
        gc.clearRect(0,0,canvasWidth.get(),canvasHeight.get());
        gc.strokeLine(0,0,canvasWidth.get(),canvasHeight.get());
    }

    private final DoubleProperty canvasWidth = new SimpleDoubleProperty(50){
        @Override
        protected void invalidated() {
            draw();
        }
    };

    public double getCanvasWidth() {
        return canvasWidth.get();
    }

    public void setCanvasWidth(double value) {
        canvasWidth.set(value);
    }

    public DoubleProperty canvasWidthProperty() {
        return canvasWidth;
    }
    private final DoubleProperty canvasHeight = new SimpleDoubleProperty(50){
        @Override
        protected void invalidated() {
            draw();
        }
    };

    public double getCanvasHeight() {
        return canvasHeight.get();
    }

    public void setCanvasHeight(double value) {
        canvasHeight.set(value);
    }

    public DoubleProperty canvasHeightProperty() {
        return canvasHeight;
    }

}

这将允许您在Inspector面板上设置它们:

enter image description here

或在您的fxml文件中:

<fx:root type="javafx.scene.layout.BorderPane" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
   <center>
      <DrawCanvas canvasWidth="150" canvasHeight="250" />
   </center>
</fx:root>