Wie zur Leinwand zu machen Resizable in javaFX?

In javaFX, um die Größe einer Leinwand gibt es keine solche Methode zu tun, die einzige Lösung ist, erstreckt sich von der Leinwand.

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

    }

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

ist, erstreckt sich von der Leinwand ist die einzige Lösung, um die Leinwand der Größe veränderbar ?
da diese Lösung funktioniert nur, wenn wir nicht wollen, zu verwenden, FXML, erklären wir in fxml eine Leinwand wie können wir es machen, resizable?

dies ist mein code :

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.AnchorPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class Main extends Application {

    Controller controller;

    @Override
    public void start(Stage primaryStage) throws Exception{
        FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
        AnchorPane root = loader.load(); //controller initialized
        controller = loader.getController();
        GraphicsContext gc = controller.canvas.getGraphicsContext2D();
        gc.setFill(Color.AQUA);
        gc.fillRect(0, 0, root.getPrefWidth(), root.getPrefHeight());
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(controller.Pane, controller.Pane.getPrefWidth(), controller.Pane.getPrefHeight()));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
  • Warum wird diese Lösung nicht funktionieren, wenn Sie mit FXML?
  • wenn ich die Lösung , werde ich Einfluss auf Objekt der Klasse canvas der FXML , die Leinwand der Größe veränderbar sein, aber wenn ich den code kompilieren die Leinwand ist nicht sichtbar, ich weiß nicht, warum.
  • Blick auf Ihren code... ich denke wohl root.getPrefWidth() und root.getPrefHeight() sind nicht zu geben, was Sie erwarten. Zu testen, einfach versuchen hart zu codieren etwas und sehen, ob es funktioniert. Darüber hinaus sind Ihnen die Einstellung der Breite und Höhe des canvas in FMXL?
  • Ich änderte root.getPrefWidth (), um controller.Pane.getPrefWidth(); es funktioniert. das problem ist nur die Leinwand ist nicht resizable. dies ist die Leinwand in FXML: <Canvas fx:id="canvas" height="267.0" layoutX="13.0" layoutY="9.0" width="450.0" AnchorPane.bottomAnchor="8.0" AnchorPane.leftAnchor="13.0" AnchorPane.rightAnchor="12.0" AnchorPane.topAnchor="9.0" />
  • Warum nicht einfach Ihre Canvas Unterklasse in der FXML? <ResizableCanvas fx:id="canvas" ... /> Nur sicherstellen, dass Sie die richtige importieren für Sie.
  • Ich wusste nicht, das können wir machen, lol, Dank ! x)

InformationsquelleAutor HinoHara | 2014-07-02
Schreibe einen Kommentar