/ / javafx Benutzerdefinierte Komponente für den Szenengenerator - javafx, benutzerdefinierte Komponente, Scenebuilder

benutzerdefinierte Komponente javafx Szene Builder - Javafx, benutzerdefinierte Komponente, Scenebuilder

Ich möchte die benutzerdefinierte Komponente im Szenengenerator verwenden.
Ich möchte eine Leinwand in eine benutzerdefinierte Komponente einbetten. Also versuche ich, die Zeichenfläche der Attribute zu ändern.
Canvas-Code wie folgt:

    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);
}
}


Benutzerdefinierter Komponentencode wie folgt:

    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 datei:

    <?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>


Ich habe es auf diese Weise versucht, aber es ist fehlgeschlagen.

    <?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>

Bitte geben Sie mir Ratschläge und Tipps.

Antworten:

4 für die Antwort № 1

Ihr Ansatz funktioniert für mich, aber Sie müssen eine gültige Zeichenfläche erstellen und einige Dimensionen angeben, andernfalls sind diese 0x0. Zum Beispiel:

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

Jetzt können Sie Ihre importieren DrawCanvas Komponente in SceneBuilder ein, wie @jewelsea vorschlägt, und Sie können sie in Ihre Szene ziehen:

Segeltuch

Sie können der Klasse einige Eigenschaften hinzufügen, z canvasWidth und canvasHeight.

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;
}

}

Auf diese Weise können Sie sie im Inspektorfenster festlegen:

Bildbeschreibung hier eingeben

oder in deinen fxml Dateien:

<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>